Python函数方法:使用filter从dict中删除键

时间:2015-09-22 22:30:59

标签: python dictionary functional-programming

跟进最近的问题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)不是我想要删除的内容,但这里的问题是保留

4 个答案:

答案 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())))