2017-12-02 15 views
1

に、私はこのコードを持って、dictの値をリスト項目に一致するからキーを取得:のpython - リストの順番

d = {'h' : 11111111, 't' : 1010101, 'e' : 10101111, 'n' : 1} 

my_list = [1010101, 11111111, 10101111, 1] 

get_keys = [k for k, v in d.items() if v in my_list] 

print(get_keys) 

私が手出力は次のようになります。

['h', 't', 'e', 'n'] 

私はそれをしたいと思いますがmy_listの順番:so

['t', 'h', 'e', 'n'] 

どうすればいいですか?ありがとうございました!

(すべての値がまたユニークである)を考えると
+0

python辞書は発注されていません。 ['OrderedDict'](https://docs.python.org/3/library/collections.html#collections.OrderedDict)を使用したい場合があります – yash

+0

値はすべて一意ですか?さもなければ、キーのいくつかがあいまいかもしれません。 – dawg

+0

すべてがユニークですはい – kieron

答えて

1
d = {'h' : 11111111, 't' : 1010101, 'e' : 10101111, 'n' : 1} 

my_list = [1010101, 11111111, 10101111, 1] 

new_list = [] 

for i in my_list: 
    for key, value in d.items(): 
     if value == i: 
      new_list.append(key) 

print(new_list) 
+0

'my_list'の各項目について、dict' d'のすべての項目をループしています。換言すれば、これはO(n^2)の複雑さを有する。これを使わないでください.... – dawg

1

>>> 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倍になります。結果が正しくありません。

視覚的には、次のようになります。比較では

enter image description here

、私は投稿方法は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が予測するものは、時間の増加に密接に関連しています。数百万の要素で何が起こるか想像することができます。

関連する問題