2016-11-29 17 views
0

リストの順序を保持するためにリストとセットをどのように交差させることができますか? 簡単な例:リストを交差させてPythonで設定し、リストの順序を保持する方法は?

k=[1,2,3,4] 
d={3,2} 
d.intersection(k) 
[2,3]#this is the ideal result 

編集:速度はあなたがフィルタリングによって秩序を維持することができますリストの内包表記を使用する必要があります

+0

'k'の要素は一意ですか? – donkopotamus

+0

いいえ、しかし、昇順です。 – user4757074

答えて

6

ここで最も重要な要因である:

[i for i in k if i in d] 

デモ:

>>> k = [1, 2, 3, 4] 
>>> d = {2, 3} 
>>> [i for i in k if i in d] 
[2, 3] 

Python 3の場合、これは最速のオプションですできる;あなたはlist(filter(d.__contains__, l))を使用することができますが、これはこの自明な例で遅い:データセットのサイズが大きくなったら

>>> from timeit import timeit 
>>> def listcomp(k, d): 
...  return [i for i in k if i in d] 
... 
>>> def filtered(k, d): 
...  return list(filter(d.__contains__, k)) 
... 
>>> timeit('listcomp(k, d)', 'from __main__ import listcomp, k, d') 
0.49590064199946937 
>>> timeit('filtered(k, d)', 'from __main__ import filtered, k, d') 
0.6533352420010488 

とタイミングが悪化:Pythonの2、filter()

>>> import random 
>>> k = sorted([random.randrange(1000) for _ in range(1000)]) 
>>> d = {random.randrange(1000) for _ in range(100)} 
>>> timeit('listcomp(k, d)', 'from __main__ import listcomp, k, d', number=10000) 
0.30027976899873465 
>>> timeit('filtered(k, d)', 'from __main__ import filtered, k, d', number=10000) 
0.4524774450001132 

は、与えられた、より高速なオプションです十分な大きさの入力:

>>> from timeit import timeit 
>>> import random 
>>> def listcomp(k, d): 
...  return [i for i in k if i in d] 
... 
>>> def filtered(k, d): 
...  return filter(d.__contains__, k) 
... 
>>> k = [1, 2, 3, 4] 
>>> d = {2, 3} 
>>> timeit('listcomp(k, d)', 'from __main__ import listcomp, k, d') 
0.4015800952911377 
>>> timeit('filtered(k, d)', 'from __main__ import filtered, k, d') 
0.4407978057861328 
>>> k = sorted([random.randrange(1000) for _ in range(1000)]) 
>>> d = {random.randrange(1000) for _ in range(100)} 
>>> timeit('listcomp(k, d)', 'from __main__ import listcomp, k, d', number=10000) 
0.4594550132751465 
>>> timeit('filtered(k, d)', 'from __main__ import filtered, k, d', number=10000) 
0.28088998794555664 

私はより速いオプションを認識していません。 available ordered set implementationsはすべて純粋なpythonのソリューションであり、遅いです。

+0

これは私の元々の解決策でしたが、遅すぎます。 – user4757074

+3

@ user4757074:これはあなたの質問に言及した場合に役立つでしょう。 –

+0

@ user4757074:私が知っている他の標準ライブラリオプションはありません。 PyPIには順序付けされた実装がありますが、これは純粋なPythonの実装であり、おそらく遅いです。 –

関連する問題