:
>>> d = {'h' : 11111111, 't' : 1010101, 'e' : 10101111, 'n' : 1}
>>> my_list = [1010101, 11111111, 10101111, 1]
あなたは辞書を反転することができます。そして、
>>> d_inverted={v:k for k,v in d.items()}
期待どおりインデックス:
>>> [d_inverted[e] for e in my_list]
['t', 'h', 'e', 'n']
これはPythonの最近のバージョンで動作します。
注:投稿したメソッドには、O(n^2)
という複雑さがあります。つまり、コードを実行する時間は要素数の2乗に比例して増加します。 要素を2倍にすると、実行時間が4倍になります。結果が正しくありません。
視覚的には、次のようになります。比較では
、私は投稿方法はO(n)
、または単独の要素の数に比例しています。 ダブルデータは実行時間の2倍です。より良い結果が得られました。 (関係なくデータのサイズと同じ実行時間ではありませんどのO(1)
としてしかし、良くない。)
あなたが比較するためにそれらを時間を計るする場合:
def bad(d,l):
new_list = []
for i in l:
for key, value in d.items():
if value == i:
new_list.append(key)
return new_list
def better(d,l):
d_inverted={v:k for k,v in d.items()}
return [d_inverted[e] for e in my_list]
if __name__=='__main__':
import timeit
import random
for tgt in (5,10,20,40,80,160,320,640,1280):
d={chr(i):i for i in range(100,100+tgt)}
my_list=list(d.values())
random.shuffle(my_list)
print("Case of {} elements:".format(len(my_list)))
for f in (bad, better):
print("\t{:10s}{:.4f} secs".format(f.__name__, timeit.timeit("f(d,my_list)", setup="from __main__ import f, d, my_list", number=100)))
プリント:
Case of 5 elements:
bad 0.0003 secs
better 0.0001 secs
Case of 10 elements:
bad 0.0006 secs
better 0.0002 secs
Case of 20 elements:
bad 0.0022 secs
better 0.0003 secs
Case of 40 elements:
bad 0.0071 secs
better 0.0004 secs
Case of 80 elements:
bad 0.0240 secs
better 0.0008 secs
Case of 160 elements:
bad 0.0912 secs
better 0.0018 secs
Case of 320 elements:
bad 0.3571 secs
better 0.0032 secs
Case of 640 elements:
bad 1.3704 secs
better 0.0053 secs
Case of 1280 elements:
bad 5.4443 secs
better 0.0107 secs
は、
ネストされたループメソッドは、3x
で開始され、データのサイズが大きくなると、遅くなると500x
に増加することがわかります。 Big Oが予測するものは、時間の増加に密接に関連しています。数百万の要素で何が起こるか想像することができます。
python辞書は発注されていません。 ['OrderedDict'](https://docs.python.org/3/library/collections.html#collections.OrderedDict)を使用したい場合があります – yash
値はすべて一意ですか?さもなければ、キーのいくつかがあいまいかもしれません。 – dawg
すべてがユニークですはい – kieron