跟进最近的问题Remove keys from object not in a list in python?
这个问题原来是前一个问题的重复。那里的所有答案,其中投票最多,使用列表理解。我正在考虑一种功能性方法。如何使用filter
完成此操作?
我们有:
testdict={'a':'vala', 'b':'valb', 'c':'valc','d':'vald'}
keep=['a','c']
我想要
filter(isKept,testdict)
给予
{'a':'vala','c':'valc'}
我尝试天真地将isKept
定义为一个(键)或两个变量(键,值)的函数,但前者只是过滤掉了正确的键而没有相应的值(即列表,而不是字典)。后一种方法甚至无法正确解析。
Python中是否有字典过滤器?
请注意testdict.pop(k)
不是我想要删除的内容,但这里的问题是保留。
答案 0 :(得分:4)
真相被告知使用理解是有功能的,但如果这不是你想要的toolz
库提供了一套很好的功能,包括>>> from toolz.dicttoolz import keyfilter
>>> to_keep = lambda key: key in set(keep)
>>> keyfilter(to_keep, testdict)
{'a': 'vala', 'c': 'valc'}
:
contentType: "application/json; charset=utf-8",
答案 1 :(得分:2)
filter()
,map()
和reduce()
等功能不会修改传递给它们的原始序列。它们返回一个新的序列或值。除此之外,如果您想在dicts上使用filter()
,则应首先使用.items()
将其转换为列表,或者更好地通过.iteritems()
将其转换为迭代器:
>>> testdict = {'a':'vala', 'b':'valb', 'c':'valc','d':'vald'}
>>> keep = ['a','c']
>>> print dict(filter(lambda entry: entry[0] in keep, testdict.items()))
{'a': 'vala', 'c': 'valc'}
答案 2 :(得分:1)
字典理解与其获得的功能一样(即它既是声明性的,也是无状态的):
{k: v for k, v in d.items() if k in keep}
此外,它是pythonic(即它是明确的,可读的和简洁的)。你真的应该喜欢这种风格。
答案 3 :(得分:0)
testdict={'a':'vala', 'b':'valb', 'c':'valc','d':'vald'}
keep=['a','c']
def isKept(dict_item):
if dict_item[0] in keep:
return True
else:
return False
print(dict(filter(isKept,testdict.items())))