Python for-in 循环前面有一个变量[重复]

2024-12-19 09:23:00
admin
原创
157
摘要:问题描述:我看到了一些类似的代码:foo = [x for x in bar if x.occupants > 1] 这是什么意思?它是如何工作的?解决方案 1:当前的答案很好,但没有谈论它们只是我们习惯的一些模式的语法糖。让我们从一个例子开始,假设我们有 10 个数字,我们想要一个大于 5 的子集。&...

问题描述:

我看到了一些类似的代码:

foo = [x for x in bar if x.occupants > 1]

这是什么意思?它是如何工作的?


解决方案 1:

当前的答案很好,但没有谈论它们只是我们习惯的一些模式的语法糖。

让我们从一个例子开始,假设我们有 10 个数字,我们想要一个大于 5 的子集。

>>> numbers = [12, 34, 1, 4, 4, 67, 37, 9, 0, 81]

对于上述任务,下面的方法完全相同,从最冗长到简洁、可读和Pythonic

方法 1

result = []
for index in range(len(numbers)):
    if numbers[index] > 5:
        result.append(numbers[index])
print result  #Prints [12, 34, 67, 37, 9, 81]

方法 2(稍微简洁一些,for-in 循环)

result = []
for number in numbers:
    if number > 5:
        result.append(number)
print result  #Prints [12, 34, 67, 37, 9, 81]

方法 3(输入列表理解)

result = [number for number in numbers if number > 5]

或者更一般地:

[function(number) for number in numbers if condition(number)]

在哪里:

  • function(x)将其x转换为有用的东西(例如x*x:)

  • 如果condition(x)返回任何 False-y 值(False、None、空字符串、空列表等),则将跳过当前迭代(想想continue)。如果函数返回非 False-y 值,则当前值将进入最终结果数组(并经过上面的转换步骤)。

要以稍微不同的方式理解语法,请查看下面的奖励部分。

欲了解更多信息,请按照其他答案所链接的教程进行操作:列表理解


奖金

(稍微不符合 Python 风格,但为了完整性,把它放在这里)

上面的例子可以写成:

result = filter(lambda x: x > 5, numbers)

上面的一般表达式可以写成:

result = map(function, filter(condition, numbers)) #result is a list in Py2

解决方案 2:

这是一个列表推导

foo将是一个经过过滤的列表,其中bar包含属性 occupants > 1 的对象

bar可以是listsetdict任何其他可迭代对象

以下是一个澄清的例子

>>> class Bar(object):
...   def __init__(self, occupants):
...     self.occupants = occupants
... 
>>> bar=[Bar(0), Bar(1), Bar(2), Bar(3)]
>>> foo = [x for x in bar if x.occupants > 1]
>>> foo
[<__main__.Bar object at 0xb748516c>, <__main__.Bar object at 0xb748518c>]

所以 foo 有 2 个Bar对象,但我们如何检查它们是什么?让我们添加一个__repr__方法,Bar以便提供更多信息

>>> Bar.__repr__=lambda self:"Bar(occupants={0})".format(self.occupants)
>>> foo
[Bar(occupants=2), Bar(occupants=3)]

解决方案 3:

由于问题的编程部分已由其他人完全回答,因此了解其与数学(集合论)的关系是很好的。实际上,它是集合构建器符号的 Python 实现:

通过规范公理定义一个集合:

B = { x є A : S(x) }

英语翻译:B是一个集合,其成员都是从A中选择出来的,所以B是A的子集(B ⊂ A),其中函数S指定的特征成立:S(x) == True

使用列表推导定义B :

B = [x 对于 x 在 A 中,如果 S(x)]

因此,为了使用列表推导式构建B ,需要从集合A中选择B的成员(用x表示) ,其中(包含条件)。S(x) == True

注意:S返回布尔值的函数称为谓词。

解决方案 4:

这将返回一个列表,其中包含 bar 中所有占用者 > 1 的元素。

解决方案 5:

据我所知,它的工作方式是检查列表“bar”是否为空 (0) 或通过 x.occupants 包含一个单例 (1),其中 x 是列表 bar 中定义的项目,可能具有 occupants 的特征。因此,foo 被调用,遍历列表,然后返回通过检查条件(即 x.occupant)的所有项目。

在 Java 之类的语言中,您可以构建一个名为“x”的类,然后将“x”个对象分配给一个数组或类似对象。X 将有一个名为“occupants”的字段,并且每个索引都将使用 x.occupants 方法进行检查,该方法将返回分配给 occupant 的号码。如果该方法返回的值大于 1(我们假设这里的 int 是奇数,因为部分 occupant 是奇数。)则 foo 方法(在所讨论的数组或类似对象上调用。)将返回一个数组或类似对象,如 foo 方法中为此容器数组或您拥有的对象所定义的那样。返回数组的元素将是第一个数组中符合“大于 1”条件的“x”对象。

Python 通过列表推导内置了方法,可以更简洁、更简化地处理这个问题。我只需编写一行代码,而不必实现两个完整的类和几个方法。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2500  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1541  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   16  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   23  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   26  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用