获取Python字典的子集

时间:2010-10-17 13:25:26

标签: python dictionary

我有一本字典:

{'key1':1, 'key2':2, 'key3':3}

我需要将该字典的子集传递给第三方代码。它只需要一个包含键['key1', 'key2', 'key99']的字典,如果它获得另一个键(例如'key3'),它会在一个令人讨厌的混乱中爆炸。有问题的代码是我无法控制的,所以我离开了我必须清理字典的位置。

将词典限制为一组键的最佳方法是什么?

鉴于上面的示例字典和允许的键,我想要:

{'key1':1, 'key2':2}

6 个答案:

答案 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)

复杂类Myclasscollections.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 ...]