我有一本字典:
{'key1':1, 'key2':2, 'key3':3}
我需要将该词典的子集传递给第三方代码。它只想要一个包含键的字典['key1', 'key2', 'key99']
,如果它得到另一个键(例如'key3'
),它就会陷入混乱之中。有问题的代码不在我的控制范围内,所以我留在必须清理字典的位置。
将字典限制为一组键的最佳方法是什么?
给定示例字典和上面允许的键,我想要:
{'key1':1, 'key2':2}
Answers:
In [38]: adict={'key1':1, 'key2':2, 'key3':3}
In [41]: dict((k,adict[k]) for k in ('key1','key2','key99') if k in adict)
Out[41]: {'key1': 1, 'key2': 2}
在Python3(或Python2.7或更高版本)中,您也可以使用dict-comprehension做到这一点:
>>> {k:adict[k] for k in ('key1','key2','key99') if k in adict}
{'key2': 2, 'key1': 1}
adict - {'key1'} == {'key2':2, 'key3':3}
dict.update
方法
{k: v for k, v in adict.items() if k in new_keys}
对{k:adict[k] for k in new_keys if k in adict}
。如果new_keys大,我们在后一种情况下是否不会遇到类似的问题?
dict(filter(lambda i:i[0] in validkeys, d.iteritems()))
d.items()
。
在现代Python(2.7 +,3.0 +)中,使用字典理解:
d = {'key1':1, 'key2':2, 'key3':3}
included_keys = ['key1', 'key2', 'key99']
{k:v for k,v in d.items() if k in included_keys}
len(d) >> len(included_keys)
(>>
表示“更大”)。但我想通常情况下len(d)不会很大...
没有dict理解的其他解决方案。
>>> a = {'key1':1, 'key2':2, 'key3':3}
>>> b = {'key1':1, 'key2':2}
>>> { k:a[k] for k in b.keys()}
{'key2': 2, 'key1': 1}
我的方法是。
from operator import itemgetter
def subdict(d, ks):
return dict(zip(ks, itemgetter(*ks)(d)))
my_dict = {'key1':1, 'key2':2, 'key3':3}
subdict(my_dict, ['key1', 'key3'])
更新资料
但是,我不得不承认,当的长度ks
为0或1时,上述实现无法处理这种情况。下面的代码处理了这种情况,不再是单行代码。
def subdict(d, ks):
vals = []
if len(ks) >= 1:
vals = itemgetter(*ks)(d)
if len(ks) == 1:
vals = [vals]
return dict(zip(ks, vals))
from operator import itemgetter as ig
会节省一些水平线空间和打字。我想我没有记得itemgetter
要提取多个项目。伟大的提醒,谢谢!