2013-03-13 47 views
2

我有一個這樣的名單:如何列表值與字典鍵比較並做它的一個新的字典使用python

lis = ['Date', 'Product', 'Price'] 

我想它比較:

dict = {'Date' : '2013-05-01', 'Salary' : '$5000', 'Product' : 'Toys', 'Price' : '$10', 'Salesman' : 'Smith'} 

我想將每個列表項與字典鍵進行比較並製作新的字典。
我曾嘗試是:

n = {} 
for k,v in dict.items(): 
    for i in lis: 
     if i==k: 
      n[k] = v 

輸出:

n = {'Date' : '2013-05-01', 'Product' : 'Toys', 'Price' : '$10'} 

這工作,但我想通過發電機來做到這一點 - 有人可以幫助我做到這一點?

+7

不要調用你的'dict''dict'它會影響Python中的'dict',用'd'代替。 – 2013-03-13 12:29:17

回答

8

款待lis爲一組,而不是,所以你可以使用dictionary views和路口:

# python 2.7: 
n = {k: d[k] for k in d.viewkeys() & set(lis)} 

# python 3: 
n = {k: d[k] for k in d.keys() & set(lis)} 

或者你可以使用一個簡單的字典的理解與對d一個in測試:

# python 2.6 or older: 
n = dict((k, d[k]) for k in lis if k in d) 

# python 2.7 and up: 
n = {k: d[k] for k in lis if k in d} 

這假定lis中的所有值都不是d;如果它們總是存在,則可以放棄if k in d測試。

針對您的特殊情況下,第二種形式是相當快了很多:

>>> from timeit import timeit 
>>> timeit("{k: d[k] for k in d.viewkeys() & s}", 'from __main__ import d, lis; s=set(lis)') 
2.156520128250122 
>>> timeit("{k: d[k] for k in lis if k in d}", 'from __main__ import d, lis') 
0.9401540756225586 
+1

如果在k中,{k:d [k]如果k中的d}比'{k:v for k,v in d.items()if k in lis}'更有效率?這樣,'in'檢查總是針對字典(攤銷O(1))而不是列表(O(n)) – Claudiu 2013-03-13 12:38:35

+0

@Claudiu進行:事實上,這可能會更好。更新。 – 2013-03-13 12:39:14

2
filtered_dict = dict((k, original_dict[k]) for k in lis if k in original_dict) 

或者,如果你有2.7+:

filtered_dict = {k: original_dict[k] for k in lis if k in original_dict} 

如果你想使用一個發電機:

item_generator = ((k, original_dict[k]) for k in lis if k in original_dict) 

發生器將產生(key, value)雙。