热门标签 | 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,它将发出该项目,否则它将忽略该项目.


推荐阅读
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • importjava.util.ArrayList;publicclassPageIndex{privateintpageSize;每页要显示的行privateintpageNum ... [详细]
  • 前景:当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社区 版权所有