2017-01-06 15 views
2

私の質問はこれと似ていますprevious SO question 私は非常に多くの連続した重複を含む非常に2つの大きなデータリスト(約1億2,000万データポイント)を持っています。連続した重複を高速で削除する

list1 = [1,1,1,1,1,1,2,3,4,4,5,1,2] #This is 20M long! 
list2 =[another list of size len(list1)]#This is also 20M long! 
i = 0 
while i < len(list)-1: 
    if list[i] == list[i+1]: 
     del list1[i] 
     del list2[i] 
    else: 
     i = i+1 

に従って、出力がなければならないように、私は残念ながら、これは、リスト内の要素を削除するために非常に遅い連続的な重複を除去するために、[1、2、3、4、5、1、2] を希望しますそれ自体では遅い操作です。このプロセスをスピードアップできる方法はありますか?上のコードで示したように、リスト2の対応する要素を削除できるように、インデックスiを追跡する必要があります。

答えて

6

Pythonはあなたのためのライブラリで、このgroupbyがあります

>>> list1 = [1,1,1,1,1,1,2,3,4,4,5,1,2] 
>>> from itertools import groupby 
>>> [k for k,_ in groupby(list1)] 
[1, 2, 3, 4, 5, 1, 2] 

ます。また、同時に第二のリストを処理するために、keyfunc引数を使用して、それを微調整することができます。

>>> list1 = [1,1,1,1,1,1,2,3,4,4,5,1,2] 
>>> list2 = [9,9,9,8,8,8,7,7,7,6,6,6,5] 
>>> from operator import itemgetter 
>>> keyfunc = itemgetter(0) 
>>> [next(g) for k,g in groupby(zip(list1, list2), keyfunc)] 
[(1, 9), (2, 7), (3, 7), (4, 7), (5, 6), (1, 6), (2, 5)] 

あなたは再び別のシーケンスにそれらのペアを分割したい場合:

>>> zip(*_) # "unzip" them 
[(1, 2, 3, 4, 5, 1, 2), (9, 7, 7, 7, 6, 6, 5)] 
+1

ここではいくつかの勝利。まず、コードを書き換えるのではなく、標準ライブラリを使用しています。 ItertoolsはC言語で実装されています。最後に、リストを繰り返し修正しようとしていません。データがどこから来ているのか、何をやっているのかによって、ジェネレータから始めて、最初に20MBのリストを避けるか、結果をジェネレータとして保持する方が効率的かもしれません。 –

+0

Whoah!私はこれについてほぼ一日過ごしたとは信じられません。あなたの解決策は速いです。そして、私が速くなると、実行時間が2時間からわずか1分に短縮されます!どうもありがとう。簡単な質問ですが、Pythonインタプリタでコードを実行すると動作します。しかし、pyCharmで実行すると、この厄介なエラーが発生し、zip(* _)の '_'は定義されません。何か案は? –

+1

リスト内包の結果を変数に代入し、 'zip(* result)'を使用します。私はインタプリタでショートカットを使用しました( '_'は"最後に評価された結果 "を参照しています)。 – wim

関連する問題