我有一个字典,里面有一大堆词条。我只对其中的几个感兴趣。有什么简单的方法可以把其他的都剪掉吗?


当前回答

在我看来,这是最简单的方法:

d1 = {'a':1, 'b':2, 'c':3}
d2 = {k:v for k,v in d1.items() if k in ['a','c']}

我也喜欢这样做来揭示价值观:

a, c = {k:v for k,v in d1.items() if k in ['a','c']}.values()

其他回答

简式:

[s.pop(k) for k in list(s.keys()) if k not in keep]

正如大多数答案所建议的那样,为了保持简洁,我们必须创建一个重复的对象,无论是list还是dict。这个函数创建了一个丢弃列表,但删除了原始字典中的键。

下面是python 2.6中的一个例子:

>>> a = {1:1, 2:2, 3:3}
>>> dict((key,value) for key, value in a.iteritems() if key == 1)
{1: 1}

过滤部分是if语句。

如果你只想选择很多键中的几个,这个方法比delnan的答案要慢。

下面是在一行中使用del的另一个简单方法:

for key in e_keys: del your_dict[key]

E_keys是要排除的键的列表。它会更新你的字典,而不是给你一个新的。

如果你想要一个新的输出字典,那么在删除之前做一个字典的副本:

new_dict = your_dict.copy()           #Making copy of dict

for key in e_keys: del new_dict[key]

构造一个新词典:

dict_you_want = {key: old_dict[key] for key in your_keys}

使用字典理解。

如果你使用的版本缺少它们(如Python 2.6及更早版本),请将其改为dict((key, old_dict[key]) for…)。它是一样的,只是更丑。

注意,与jnnnnn版本不同的是,对于任何大小的old_dicts具有稳定的性能(仅取决于your_keys的数量)。无论是速度还是内存。因为这是一个生成器表达式,所以它一次处理一个项,并且不会查看old_dict的所有项。

把所有东西都移走:

unwanted = set(keys) - set(your_dict)
for unwanted_key in unwanted: del your_dict[unwanted_key]

给定你的原始字典orig和你感兴趣的键的条目集:

filtered = dict(zip(keys, [orig[k] for k in keys]))

这并不像delnan的答案那么好,但应该适用于每个感兴趣的Python版本。然而,它对原始字典中存在的每个键元素都是脆弱的。