获取Python字典的子集

Oli*_*Oli 60 python dictionary

我有一本字典:

{'key1':1, 'key2':2, 'key3':3}
Run Code Online (Sandbox Code Playgroud)

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

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

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

{'key1':1, 'key2':2}
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 64

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}
Run Code Online (Sandbox Code Playgroud)

在Python3(或Python2.7或更高版本)中,您也可以使用dict-comprehension:

>>> {k:adict[k] for k in ('key1','key2','key99') if k in adict}
{'key2': 2, 'key1': 1}
Run Code Online (Sandbox Code Playgroud)

  • Dict理解也在Python 2.7中. (7认同)
  • {k:v代表k,v代表adict.items()如果k in('key1','key2','key99')}也很好用.只是略有不同. (3认同)
  • @user90038:感谢您的评论。但请注意,如果 `adict` 很大,则 `for k,v in adict.items()` 需要多次迭代。`for k in (...)` 需要 3 次迭代。 (3认同)
  • 为了让事情变得更简单,请考虑“{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 很大,我们在后一种情况下是否会遇到类似的问题? (2认同)

Bjö*_*lex 21

dict(filter(lambda i:i[0] in validkeys, d.iteritems()))
Run Code Online (Sandbox Code Playgroud)

  • 对于python 3,应该是`d.items()`. (3认同)

Naz*_*hal 10

没有 if in dict comprehension 的另一种解决方案。

>>> a = {'key1':1, 'key2':2, 'key3':3}
>>> b = {'key1':1, 'key2':2}
>>> { k:a[k] for k in b.keys()}
{'key2': 2, 'key1': 1}
Run Code Online (Sandbox Code Playgroud)


wat*_*nic 5

在现代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}
Run Code Online (Sandbox Code Playgroud)