热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python3.6使用带有lambda的filter()迭代字典列表不会返回字典的值

如何解决《Python3.6使用带有lambda的filter()迭代字典列表不会返回字典的值》经验,为你挑选了2个好方法。

有一个字典列表我需要迭代并过滤符合条件的字典,然后只返回key1下的值.我正在使用过滤器,如下所示:

res = list(filter(lambda x: x["key1"] if ["key2"] == criterion else False, list_of_dicts))

迭代器可以正常返回那些符合标准的结果.但它返回整个字典而不仅仅是x["key1"].我认为它与过滤器有关但却没有任何线索.

Q1:有人可以解释为什么它返回整个dict而不是key1下的值吗?

Q2:是否有一种解决方法使过滤器只返回key1下的值?

PS通过列表理解这样做是没有问题的:

res = [i["key1"] for i in list_of_dicts if i["key2"] == criterion]

但我只是好奇为什么过滤器不会返回i["key1"].



1> Martijn Piet..:

过滤与映射不同.过滤根据您的标准选择,是/否决定是否包含您的一个值.

事实上,你正在过滤两者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)))

但正如你所注意到的那样,这很快就会变得冗长和不可读.您可以使用operator.itemgetter()对象来替换lambdas:

from operator import itemgetter

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

但可读性并没有太大提高.


@new_to_coding:它更快,因为列表推导循环完全作为字节码解释步骤执行,包括过滤器测试和提取表达式.这里是`itemgetter()`和`map()`和`filter()`的组合,它是真正的速度恶魔,*所有的执行*完全在C代码中完成,在解释器循环之外.
@new_to_coding:我确实犯了一个错误; 过滤器必须测试与条件的相等性,此时性能提升会减弱.

2> Willem Van O..:

过滤器只是过滤:它将可迭代的输入作为输入,并生成与满足标准的项目的可互换性.

你想要的是一个额外的mapping:

from operator import itemgetter

key1 = itemgetter('key1')

res = list(map(key1,filter(lambda x: ["key2"] == criterion, list_of_dicts)))

请注意,您不需要x['key1'] if ... else False在标准中使用:filter(..)将简单地评估函数,并检查结果的真实性.如果是True,它将发出该项目,否则它将忽略该项目.


推荐阅读
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • importjava.util.ArrayList;publicclassPageIndex{privateintpageSize;每页要显示的行privateintpageNum ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
于昕会_445
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有