リストの順序を保持するためにリストとセットをどのように交差させることができますか? 簡単な例:リストを交差させてPythonで設定し、リストの順序を保持する方法は?
k=[1,2,3,4]
d={3,2}
d.intersection(k)
[2,3]#this is the ideal result
編集:速度はあなたがフィルタリングによって秩序を維持することができますリストの内包表記を使用する必要があります
リストの順序を保持するためにリストとセットをどのように交差させることができますか? 簡単な例:リストを交差させてPythonで設定し、リストの順序を保持する方法は?
k=[1,2,3,4]
d={3,2}
d.intersection(k)
[2,3]#this is the ideal result
編集:速度はあなたがフィルタリングによって秩序を維持することができますリストの内包表記を使用する必要があります
ここで最も重要な要因である:
[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のソリューションであり、遅いです。
これは私の元々の解決策でしたが、遅すぎます。 – user4757074
@ user4757074:これはあなたの質問に言及した場合に役立つでしょう。 –
@ user4757074:私が知っている他の標準ライブラリオプションはありません。 PyPIには順序付けされた実装がありますが、これは純粋なPythonの実装であり、おそらく遅いです。 –
'k'の要素は一意ですか? – donkopotamus
いいえ、しかし、昇順です。 – user4757074