Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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 3.6使用filter()和lambda遍历字典列表不';t返回字典';s值_Python_List_Dictionary_Filter - Fatal编程技术网

Python 3.6使用filter()和lambda遍历字典列表不';t返回字典';s值

Python 3.6使用filter()和lambda遍历字典列表不';t返回字典';s值,python,list,dictionary,filter,Python,List,Dictionary,Filter,这里有一个字典列表,我需要遍历并过滤符合条件的字典,然后只返回键1下的值。我正在使用过滤器,如下所示: res = list(filter(lambda x: x["key1"] if ["key2"] == criterion else False, list_of_dicts)) 迭代器正常工作,只返回满足条件的结果。但是它返回整个字典,而不仅仅是x[“key1”]。 我想这和过滤器有关,但我不知道 有人能解释为什么它返回整个dict而不是键1下的唯一值吗 问题2:是否有一种变通方法可以使

这里有一个字典列表,我需要遍历并过滤符合条件的字典,然后只返回键1下的值。我正在使用过滤器,如下所示:

res = list(filter(lambda x: x["key1"] if ["key2"] == criterion else False, list_of_dicts))
迭代器正常工作,只返回满足条件的结果。但是它返回整个字典,而不仅仅是
x[“key1”]
。 我想这和过滤器有关,但我不知道

有人能解释为什么它返回整个dict而不是键1下的唯一值吗

问题2:是否有一种变通方法可以使过滤器只返回键1下的值

另外,通过这样的列表理解是没有问题的:

res = [i["key1"] for i in list_of_dicts if i["key2"] == criterion]
但我只是好奇为什么filter不返回
I[“key1”]

一个filter只是过滤:它将一个iterable作为输入,并生成一个包含满足条件的项的interable

您需要的是一个附加的
map
ping:

从操作员导入itemgetter
key1=itemgetter('key1')
res=列表(映射(键1,过滤器(lambda x:[“键2”]==标准,目录列表))
请注意,如果。。。标准中的else False:过滤器(..)将简单地计算函数,并检查结果的真实性。如果它是
True
,它将发出该项,否则它将忽略该项。

过滤与映射不同。过滤根据您的条件选择是否包含某个值的是/否决定

事实上,您正在对
key2
key1
的真值进行过滤;如果
key1
的值设置为
None
0
或其他值,您也会删除该特定词典,我认为您并不真正需要它

您想要筛选和映射,所以从通过筛选的字典中提取正确的键。实际上,最好是通过列表理解:

res = [x["key1"] for x in list_of_dicts if ["key2"] == criterion]
如果必须,您仍然可以使用
filter()
,但需要为此添加
map()
调用以实际执行映射:

res = list(map(lambda x: x["key1"], filter(lambda x: ["key2"], list_of_dicts)))
但正如你所注意到的,这很快就会变得冗长和不真实。您可以使用替换
lambda
s:

from operator import itemgetter

res = list(map(itemgetter("key1"), filter(lambda d: d["key2"] == condition, list_of_dicts)))

但可读性并没有因此得到很大提高

我不太确定它是否比列表理解快,我已经用map和list comprehension做了很多测试,只有当变量非常大时,map才会领先,尽管我不能说filter和itemgetter。u.@new_to_编码:它更快,因为列表理解循环完全作为字节码解释步骤执行,包括过滤测试和提取表达式。这是
itemgetter()
map()
filter()
的组合,这里是真正的速度魔鬼,所有的执行都完全在C代码中完成,在解释器循环之外。@new\u to\u编码:我犯了一个错误;过滤器必须根据条件测试是否相等,此时性能提升会降低。@MartijnPieters感谢您的响应Martjin,这一点非常清楚,尤其是使用map函数。正如Willem所指出的,过滤器返回一个iterable。所以,我只是想知道,如果iterable被返回,为什么过滤器不能像处理它在构造函数中接受的iterable对象那样处理它?@Vlad:我不知道你在问什么<代码>过滤器()是一个非常特殊的工具。它会过滤,也不会映射。如果你问为什么它不能返回你交给它的相同类型的对象:因为iterable是一个接口,不同类型的加载可以实现它。并不是所有的这些都可以像那样被重新创造,它们都可以有不同的创造方法。谢谢threory Willem!现在有道理了。
from operator import itemgetter

res = list(map(itemgetter("key1"), filter(lambda d: d["key2"] == condition, list_of_dicts)))