2017-02-20 10 views
0

私は数千のレコードを持つサブリストのリストを持っています。リストから サンプルはこれです:Pythonの高速サブセットサブリスト

list_full = [ 
    [343, 354,"Sometext1", "Sometext2", "Sometext3"], 
    [43543, 345435,"Sometext1", "Sometext2", "Sometext3"], 
    [4354, 54354,"Sometext1", "Sometext2", "Sometext3", 
     "Sometext4", "Sometext5"] 
] 

私は2つの別々のリストには、このメインリストのサブセットをしたいです。最初のリストには、サブリストの各最初の2つのレコードと、残りのレコードがあります。

list_1 = [] 
list_2 = [] 

for item in list_full: 
    list_1.append(item[:2]) 
    list_2.append(item[2:]) 

しかし、ループを使用し、一種の遅いです:私は次のスクリプトを持って

list_a = [[343, 354], [43543, 345435], [004354, 54354]] 
list_b = [["Sometext1", "Sometext2", "Sometext3"], ["Sometext1", "Sometext2", "Sometext3"], ["Sometext2", "Sometext3", "Sometext4", "Sometext5"]] 

: 例として、私は、それらに保存する必要があります。このリストサブセットを実行するより速い方法がありますか?ありがとう!私はitertoolsとlazylyそれを行うだろう

+1

が見えます。私はパンダの図書館を見てみることをお勧めします。それは、潜在的な興味深い図書館のようなものです。スライシング、インデックス作成など、多くの機能を実行することができます。 –

+1

あなたの現在のアプローチはちょうど良いと思います。他の考えられるアプローチ(リスト内包や 'map'など)は、' list_full'を一度ではなく2回繰り返します。 –

+0

ヒントありがとうございます。リストの理解はより速く見える。 – Litwos

答えて

1

import itertools 

list1 = itertools.imap(lambda x: itertools.islice(x, 0, 2), list_full) 
list1 = itertools.imap(lambda x: itertools.islice(x, 2, None), list_full) 

あなたがそれを必要とするまでの計算が評価されることはありませんこの方法です。即座に評価したい場合は、list()を呼び出して、itertoolsオブジェクトをリストに変換することができます。

+0

答えをありがとう。小さなデータのサブセットでは、リストの理解がより速いとわかりました。 – Litwos

+0

@Litwos、はい、小さなデータの場合itertoolsはおそらくもっと遅くなりますが、巨額の金額を考えればそれについて考えるでしょう:) – Netwave

+0

私はより大きなサブセットで再度テストし、リストの理解よりも速いです。ありがとうございます – Litwos

1

これを試してみてください:

# to create two lists 
list_1 = [x[:2] for x in list_full] 
list_2 = [x[2:] for x in list_full] 

# to create two generators, supporting iteration (with for) but not indexing 
list_1 = (x[:2] for x in list_full) 
list_2 = (x[2:] for x in list_full) 

あるいは、パイソン3で、簡単にリストを作成せずにデータを反復処理するために:

for a, b, *other in list_full: 
    print("first:", a, b) 
    print("other:", other) 
+0

インデックス作成が必要なため発電機を使用できません。リストの理解は、データのサブセットで最も速いものでした。ありがとう! – Litwos

1

あなたはリスト内包表記を試すことができ、

list_1=[item[:2] for item in list_full] 
list_2 = [item[2:] for item in list_full] 

documentsに基づいて、リストの理解はループよりもはるかに高速です。あなたが構造化されたデータのいくつかの種類にworkigされているように、リストの内包表記を使用している間

あなたは、

from timeit import default_timer as timer 
start=timer() 
list_1 = [] 
list_2 = [] 

for item in list_full: 
    list_1.append(item[:2]) 
    list_2.append(item[2:]) 

print list_1 
print list_2 

end=timer() 

print end-start #Takes 0.0002339 

timeitを用いた方法の両方にかかる時間を計算することができ、あなたの問題文で

from timeit import default_timer as timer 
start = timer() 
list_1=[item[:2] for item in list_full] 
list_2 = [item[2:] for item in list_full] 

print list_1 
print list_2 

end = timer() 

print end-start #gives 0.0002105 
+0

私は小さなデータサンプルでテストしましたが、あなたの答えは最も速いものです。ありがとう! – Litwos

+0

私は提案されたより大きなデータサンプルをテストし、itertoolsの使用がより高速であることを証明しました。より小さなサブセットのリスト理解を念頭に置いていきます! :) – Litwos