2016-09-15 128 views
1

給出了一個帶有N個鍵和一個K鍵的元組的字典,K < = N是否有一種pythonic方式來獲得只有K個鍵的字典?使用元組從字典創建詞典Python

ex。

orig_dict = {'key1':'value1', 'key2':'value2', ..., 'keyN':'valueN'} 

tuple = ('key2', 'keyM') 

newdict = myFunc(orig_dict, tuple) 

print newdict 

輸出:

'key2':'value2', 'keyM':'valueM' 

回答

2

您可以使用字典解析:

{k:v for k,v in orig_dict.iteritems() if k in tuple_keys} 

觀察:

>>> orig_dict = {'key1':'value1', 'key2':'value2', 'keyN':'valueN'} 
>>> tuple_keys = ('key2', 'keyN') 
>>> {k:v for k,v in orig_dict.iteritems() if k in tuple_keys} 
{'keyN': 'valueN', 'key2': 'value2'} 
2

只需使用一個理解:

tple = ('key2', 'keyM') 
{k: orig_dict[k] for k in tple} 

或者如果你喜歡的功能:

from operator import itemgetter 

dict(zip(tple, itemgetter(*tple)(orig_dict))) 

更重要的是Python的是值得商榷的,什麼是絕對不能Python的使用元組作爲變量名。

如果某些項可能不存在,你可以得到intersectionviewkeys

dict(zip(tuple, itemgetter(*orig_dict.viewkeys() & tple)(orig_dict))) 

{k : orig_dict[k] for k in orig_dict.viewkeys() & tple} 

對於python3只使用.keys()它返回一個dict_view對象,而不是在python2列表。

如果你想給的默認值丟失的鑰匙,你也可以使用地圖dict.get所以丟失的鑰匙將有其值設置爲無。

dict(zip(tuple, map(orig_dict.get, tuple) 
+0

打你到這個時候,坎寧安先生! –

+0

@ juanpa.arrivillaga,略有不同的方法,我完全相信所有的鑰匙都在那裏:) +1無論如何 –

+1

:)爲'itemgetter'的方法,+1 –

1

使用字典理解

orig_dict = {'key1':'value1', 'key2':'value2', 'keyN':'valueN'} 
keys = ('key2', 'keyM') 

>>> {k:orig_dict[k] for k in keys if k in orig_dict} 
{'key2': 'value2'} 

這將是比遍歷字典的鍵和檢查元組是否存在的關鍵,因爲它是一個O(1)操作查找更高效dict vs O(n)來搜索一個元組。

或者,您也可以使用一組,以獲得共同鍵和結合起來,與一個字典理解:

>>> {k:orig_dict[k] for k in set(keys).intersection(orig_dict)} 
{'key2': 'value2'} 
+0

啊是的。絕對是更好的解決方案。 +1 –