2016-09-15 142 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 –