Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python函数方法:使用过滤器从dict中删除键_Python_Dictionary_Functional Programming - Fatal编程技术网

Python函数方法:使用过滤器从dict中删除键

Python函数方法:使用过滤器从dict中删除键,python,dictionary,functional-programming,Python,Dictionary,Functional Programming,最近问题的后续行动 那个问题原来是前一个问题的重复。所有答案,其中投票最多的,都使用列表理解。我在考虑功能性方法。如何使用过滤器 我们有: testdict={'a':'vala', 'b':'valb', 'c':'valc','d':'vald'} keep=['a','c'] 我想要 filter(isKept,testdict) 给予 {'a':'vala','c':'valc'} 我尝试天真地将iskeep定义为一个(键)或两个变量(键、值)的函数,但前者只是过滤掉没有相应值的正

最近问题的后续行动

那个问题原来是前一个问题的重复。所有答案,其中投票最多的,都使用列表理解。我在考虑功能性方法。如何使用
过滤器

我们有:

testdict={'a':'vala', 'b':'valb', 'c':'valc','d':'vald'}
keep=['a','c']
我想要

filter(isKept,testdict)
给予

{'a':'vala','c':'valc'}
我尝试天真地将
iskeep
定义为一个(键)或两个变量(键、值)的函数,但前者只是过滤掉没有相应值的正确键(即列表,而不是字典)。后一种方法甚至不能正确解析

Python中是否有字典过滤器


请注意,
testdict.pop(k)
不是我想要的,因为这会删除,但这里的问题是保留。

filter()
map()
reduce()
这样的函数不会修改传递给它们的原始序列。它们返回一个新的序列或值。除此之外,如果您想在dicts上使用
filter()
,您应该首先使用
.items()
将其转换为列表,或者更好地通过
.iteritems()
将其转换为迭代器:


事实上,使用理解功能是非常有用的,但如果这不是您想要的,则库提供了一组很好的功能,包括
keyfilter

>>> from toolz.dicttoolz import keyfilter
>>> to_keep = lambda key: key in set(keep)
>>> keyfilter(to_keep, testdict)
{'a': 'vala', 'c': 'valc'}

口述理解是功能性的(即它既是声明性的又是无状态的):


此外,它是pythonic(即,它是明确的、可读的和简洁的)。你真的应该更喜欢这种风格。

过滤器
不是一种很好的方法,因为它总是返回一个包含过滤值的列表,所以用它修改原始列表是没有意义的。@ozgur是的,我有点注意到过滤器似乎不适用于字典,而适用于列表。因此,我的最后一个问题是,是否有一个dict的过滤函数可以作为函数使用?是的,但您应该首先使用
dict.items()
将字典转换为列表。我认为您对函数式编程中的
functional
的一般含义有些困惑。dict理解有什么问题吗?非常感谢!这似乎更接近我的想法,尽管python在这里有点作弊,因为首先我们需要将dict翻译成元组列表。这是否意味着DICT真的没有“自然”的过滤函数,我们需要修改我们自己的过滤函数-例如,正如您在这里向我们展示的那样?不,因为在scheme、lisp等函数式编程语言中,这些函数应用于一系列值并生成另一组值。他们不会就地修改给定的输入序列。我不确定我是否理解您的意思。我想说python中的映射(函数、列表)的行为就是这样,即它不修改列表。您自己的答案也不会修改testdict。所以,我们在python中似乎有“严格的函数”。对不起,我误解了。你的问题的答案是否定的。没有内置的过滤功能可以在DICT上运行。这就是为什么有一个名为
toolz.keyfilter
的第三方函数,它基本上只对按键进行操作。再次感谢!我想这就完成了对我原来问题的回答。我不认为我能接受两个或两个以上的答案,而且对zero323这样做似乎是公平的,因为它明确地构造了我所要求的解决方案。希望你不要认为这是无视你的贡献。它不是!啊哈!我不知道图尔兹的事。是的,这正是我的想法。我之所以考虑这种合成方法,是因为在我看来,当进一步使用其他函数(比如说附加的映射和过滤器)合成时,它更具可读性。再次感谢您提供的额外指针。在
iskeep
中,为什么不在keep中返回dict_项[0]?
>>> from toolz.dicttoolz import keyfilter
>>> to_keep = lambda key: key in set(keep)
>>> keyfilter(to_keep, testdict)
{'a': 'vala', 'c': 'valc'}
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())))
{k: v for k, v in d.items() if k in keep}