我有一个dict
,里面有很多条目。 我只对其中一些感兴趣。 有没有一种简单的方法可以将其他所有元素都修剪掉?
#1楼
基于delnan接受的答案。
如果您想要的键之一不在old_dict中怎么办? delnan解决方案将引发您可以捕获的KeyError异常。 如果那不是您所需要的,也许您想:
仅在old_dict和您的通缉钥匙组中包含存在的钥匙。
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'}
具有在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'}
#2楼
此功能可以解决问题:
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版本不同,该操作未在适当位置完成,因此性能与字典中键的数量有关。 但是,这样做的好处是该函数不会修改提供的字典。
编辑:添加了一个单独的功能,用于从字典中排除某些键。
#3楼
此一线性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}
这是对列表键(i在x中)进行迭代的基本列表理解,如果键位于所需的键列表(y)中,则输出元组(键,值)对的列表。 dict()将整个内容包装为dict对象。
#4楼
dict理解稍微更优雅:
foodict = {k: v for k, v in mydict.items() if k.startswith('foo')}
#5楼
from funcy import project
small_dict = project(big_dict, keys)
还要看看select_keys 。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3162603