过滤词典只包含某些键?

我有一个dict ,有一大堆条目。 我只对其中一些select感兴趣。 有没有简单的方法来修剪所有其他的?

构build一个新的字典:

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

使用字典理解。

如果你使用缺less它们的版本(比如Python 2.6和更早的版本),那么把它dict((your_key, old_dict[your_key]) for ...) 。 这是一样的,虽然丑陋。

请注意,与jnnnnn的版本不同的是,这对于任何大小的old_dict都具有稳定的性能(仅取决于your_keys的数量)。 在速度和记忆方面。 由于这是一个生成器expression式,它一次处理一个项目,并且不会查看所有old_dict项目。

删除所有内容:

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

下面是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语句。

如果你只想select一些非常多的键,这个方法比delnan的答案慢。

稍微更优雅的词典理解:

 foodict = {k: v for k, v in mydict.items() if k.startswith('foo')} 

你可以用我的funcy库中的项目function来做到这一点 :

 from funcy import project small_dict = project(big_dict, keys) 

另外看看select_keys 。

给定您的原始字典orig和您对keys感兴趣的条目集合:

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

这不像delnan的答案那么好,但应该在每个感兴趣的Python版本中工作。 但是,对原始字典中存在的每个keys元素都是脆弱的。

这一个class轮lambda应该工作:

 dictfilt = lambda x, y: dict([ (i,x[i]) for i in x if i in set(y) ]) my_dict = {"a":1,"b":2,"c":3,"d":4} wanted_keys = ("c","d") # run it In [10]: dictfilt(my_dict, wanted_keys) Out[10]: {'c': 3, 'd': 4} 

这是一个基本的列表理解迭代你的字典键(我在X),并输出一个元组(键,值)对列表,如果键居住在你想要的键列表(Y)。 一个dict()包装整个东西输出为一个字典对象。

根据delnan接受的答案。

如果你想要的某个键不在old_dict中呢? delnan解决scheme将会抛出一个你可以捕获的KeyErrorexception。 如果这不是你所需要的,也许你想:

  1. 只包含在old_dict和want_keys集合中的关键字。

     old_dict = {'name':"Foobar", 'baz':42} wanted_keys = ['name', 'age'] new_dict = {k: old_dict[k] for k in set(wanted_keys) & set(old_dict.keys())} >>> new_dict {'name': 'Foobar'} 
  2. 对于在old_dict中未设置的键具有默认值。

     default = None new_dict = {k: old_dict[k] if k in old_dict else default for k in wanted_keys} >>> new_dict {'age': None, 'name': 'Foobar'} 

代码1:

 dict = { key: key * 10 for key in range(0, 100) } d1 = {} for key, value in dict.items(): if key % 2 == 0: d1[key] = value 

代码2:

 dict = { key: key * 10 for key in range(0, 100) } d2 = {key: value for key, value in dict.items() if key % 2 == 0} 

代码3:

 dict = { key: key * 10 for key in range(0, 100) } d3 = { key: dict[key] for key in dict.keys() if key % 2 == 0} 

所有的代码性能都是用time = 1000来测量的,每个代码收集1000次。

在这里输入图像描述

对于python 3.6来说,三种filter的performance方式几乎是一样的。 对于Python 2.7代码3稍快。

这个函数将会诀窍:

 def include_keys(dictionary, keys): """Filters a dict by only including certain keys.""" key_set = set(keys) & set(dictionary.keys()) return {key: dictionary[key] for key in key_set} 

就像delnan的版本一样,这个版本使用字典理解,并且对于大型字典具有稳定的性能(仅取决于允许的键数,而不是字典中键的总数)。

就像MyGGan的版本一样,这个允许您的键列表包含字典中可能不存在的键。

作为奖励,这里是反过来,你可以通过排除原文中的某些键来创build一个字典:

 def exclude_keys(dictionary, keys): """Filters a dict by excluding certain keys.""" key_set = set(dictionary.keys()) - set(keys) return {key: dictionary[key] for key in key_set} 

请注意,与delnan的版本不同,操作没有完成,因此性能与字典中的键数有关。 但是,这样做的好处是该函数不会修改所提供的字典。

编辑:添加了一个单独的function,从字典中排除某些键。

简写:

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

由于大多数答案build议为了保持简洁,我们必须创build一个重复的对象,不pipe它是一个list还是dict 。 这个创build一个丢弃list但删除原来的dict的键。