我有一个字典,里面有一大堆词条。我只对其中的几个感兴趣。有什么简单的方法可以把其他的都剪掉吗?
当前回答
代码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}
所有代码段的性能都用timeit度量,使用number=1000,并为每段代码收集1000次。
对于python 3.6,三种过滤字典键的方式的性能几乎相同。对于python 2.7,代码3略快一些。
其他回答
你可以使用python-benedict,它是dict的子类。
安装:pip install python-benedict
from benedict import benedict
dict_you_want = benedict(your_dict).subset(keys=['firstname', 'lastname', 'email'])
它在GitHub上开源:https://github.com/fabiocaccamo/python-benedict
声明:我是这个库的作者。
这个函数可以做到:
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的版本一样,这个版本允许您的键列表包含字典中可能不存在的键。
作为奖励,这里是反向的,在这里你可以通过排除原始的某些键来创建字典:
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版本不同的是,该操作不是在适当的位置完成的,因此性能与字典中的键数有关。但是,这样做的好处是该函数不会修改所提供的字典。
编辑:添加了一个单独的功能,用于从字典中排除某些键。
如果给定字典中没有一个过滤器键,则接受的答案抛出KeyError。
要获得给定字典的副本,只包含允许键中的一些键,一种方法是检查该键是否确实存在于字典推导中给定的字典中:
filtered_dict = { k: old_dict[k] for k in allowed_keys if k in old_dict }
这不会影响性能,因为对字典的查找具有恒定的运行时复杂性。
或者,您可以使用old_dict。获取(k, some_default)来填充缺失的项。
这只是一个简单的单行函数,带有一个过滤器,只允许现有的键。
data = {'give': 'what', 'not': '___', 'me': 'I', 'no': '___', 'these': 'needed'}
keys = ['give', 'me', 'these', 'not_present']
n = { k: data[k] for k in filter(lambda k: k in data, keys) }
print(n)
print(list(n.keys()))
print(list(n.values()))
输出:
{“给予”:“什么”,“我”:“我”,“这些”:“需要”} ['give', 'me', 'these'] ['what', 'I', 'needed']
下面是在一行中使用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]
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if
- 如何在Python中获得所有直接子目录