给出一个包含N个键和一个K键元组的字典,K< = N是否有一种pythonic方式来获取只有K键的字典?
离。
orig_dict = {'key1':'value1', 'key2':'value2', ..., 'keyN':'valueN'}
tuple = ('key2', 'keyM')
newdict = myFunc(orig_dict, tuple)
print newdict
输出:
'key2':'value2', 'keyM':'valueM'
答案 0 :(得分: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'}
答案 1 :(得分:2)
只需使用理解:
tple = ('key2', 'keyM')
{k: orig_dict[k] for k in tple}
或者如果您更喜欢功能性:
from operator import itemgetter
dict(zip(tple, itemgetter(*tple)(orig_dict)))
更多 pythonic 是有争议的,绝对不是pythonic的是使用元组作为变量名。
如果某些密钥可能不存在,您可以使用intersection获取viewkeys:
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中的列表。
如果您想为缺少的密钥提供默认值无,您还可以将 map 与 dict.get 一起使用,以便丢失密钥将它们的值设置为无。
dict(zip(tuple, map(orig_dict.get, tuple)
答案 2 :(得分: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与O(n)以在元组中搜索。
或者你可以使用一个集来获取公共密钥并将其与字典理解相结合:
>>> {k:orig_dict[k] for k in set(keys).intersection(orig_dict)}
{'key2': 'value2'}