我有一本字典:
{'key1':1, 'key2':2, 'key3':3}
我需要将该字典的子集传递给第三方代码。它只需要一个包含键['key1', 'key2', 'key99']
的字典,如果它获得另一个键(例如'key3'
),它会在一个令人讨厌的混乱中爆炸。有问题的代码是我无法控制的,所以我离开了我必须清理字典的位置。
将词典限制为一组键的最佳方法是什么?
鉴于上面的示例字典和允许的键,我想要:
{'key1':1, 'key2':2}
答案 0 :(得分:61)
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}
答案 1 :(得分:20)
dict(filter(lambda i:i[0] in validkeys, d.iteritems()))
答案 2 :(得分:4)
在现代Python(2.7 +,3.0 +)中,使用词典理解:
<settings>
<setting name="TraceFileName" value="C:\Temp\odpnet4.trc"/>
<setting name="TraceLevel" value="7"/>
<setting name="TraceOption" value="1"/>
</settings>
</version>
</oracle.manageddataaccess.client>
答案 3 :(得分:3)
没有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}
答案 4 :(得分: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))
答案 5 :(得分:0)
复杂类Myclass
是collections.UserDict
的子类。要选择它的一个子集,即保留其所有容器属性,定义一个方法很方便,例如这样命名为sub
:
def sub(self, keys):
subset = Myclass() # no arguments; works if defined with only keyword arguments
for key in keys:
subset[key] = self[key]
return subset
然后用作Myclass.sub([key1, key2 ...]
)