2011-08-13 8 views
2

を設定し、全てについてa[n][0]b[n][0]を比較すると、nabである。私はset_a.difference(set_b)を行うことを可能にするこれらのサブリスト項目の2つのセットを作り、その逆も非常に速いです。より遅い(おそらく明らかにされる)aで残りの項目に基づいて2つのリストを作成し、bもっと効率的な方法は、私は2つの大きなリストを持っている

def remaining(ls ,y, z): 
    return [i for i in ls if i[0] in y.difference(z)] 
lsa又は b、及び yのいずれかである

zは上記に詳述二組です。キーとしてa[0]b[0]値でdictsを使用して(例えば、これをスピードアップするためabの構造を見直し中の任意の点はありますか?

答えて

2

を私はあなたのテストと思われます。リスト内では、各要素のy.differenceが呼び出されます。試してみてください:

def remaining(ls, y, z): 
    diff = y.difference(z) 
    return filter(lambda i: i[0] in diff, ls) 
+0

10kアイテムリストに対してテストすると、ほぼ即時になります。おそらくもっと徹底的にテストするべきですが、あなたの疑惑は正しいと思われます。 – urschrei

1

少なくともdef remaining(ls ,y, z):def remaining(ls, common_set):に書き換えされなければならない。

は、次のアイデアを考えてみましょう:(おそらく__slots__付き)オブジェクトに['abcdefghijklmno', 'foo', 'bar']をラップのみ'abcdefghijklmno'値を使用して、その__hash__定義あなたがset(a) - set(b)を行うことができるようになります後ということと、あなたが解決したタスクを取得

+0

ハア!決して私には起こらなかった。 – urschrei

+1

あなたは交差点を望んでいないのですか? –

+0

@マシン憧れ。 –

関連する問題