2017-12-02 143 views
1

我有這樣的代碼:蟒蛇 - 從匹配列表項與字典值,在列表順序獲得關鍵

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的順序如下:

['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'中的每個項目,您正在循環字典'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)複雜性。這意味着執行代碼的時間將隨着元素數量的平方增加。 將元素加倍,可以使執行時間增加四倍。效果不好。

在視覺上,看起來像這樣:

enter image description here

相比較而言,我張貼的方法是O(n),或者正比於單獨元件的數量。 數據翻倍是執行時間的兩倍。效果更好。 (但不如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。時間的增加跟蹤大O的預測。你可以想象數百萬元素會發生什麼。