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

2024-12-19 09:23:00
admin
原创
70
摘要:问题描述:我看到了一些类似的代码: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 通过列表推导内置了方法,可以更简洁、更简化地处理这个问题。我只需编写一行代码,而不必实现两个完整的类和几个方法。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1008  
  在项目管理中,变更是一个不可避免的现象。无论是客户需求的调整、市场环境的变化,还是技术方案的更新,都可能引发项目的变更。如果处理不当,这些变更可能会导致项目延期、成本超支,甚至项目失败。因此,如何有效地应对项目变更,成为项目管理中的核心挑战之一。IPD(集成产品开发)作为一种高效的项目管理方法,其流程图不仅能够帮助团队...
IPD流程中的charter   0  
  IPD(Integrated Product Development,集成产品开发)是华为在长期实践中总结出的一套高效产品开发管理体系。它不仅帮助华为在全球市场中脱颖而出,也成为许多企业提升产品开发效率的参考标杆。IPD的核心在于通过跨部门协作、流程优化和资源整合,实现从需求分析到产品交付的全生命周期管理。通过实施IP...
IPD开发流程管理   0  
  华为IPD(集成产品开发)流程是一种以客户需求为导向、跨部门协同的高效项目管理方法。它通过系统化的流程设计和严格的阶段控制,确保项目从概念到交付的每个环节都能高效运作。IPD流程的核心在于打破传统职能部门的壁垒,将产品开发、市场、销售、供应链等关键环节整合到一个统一的框架中,从而实现资源的优化配置和信息的无缝流动。这种...
IPD流程中TR   0  
  在项目管理的实践中,CDCP(Certified Data Center Professional)认证评审是一个至关重要的环节。通过这一评审,项目团队不仅能够验证其数据中心设计和运营的合规性,还能提升整体管理水平。为了确保评审的顺利进行,准备一系列关键文档是必不可少的。这些文档不仅是评审的依据,也是项目团队与评审专家...
华为IPD是什么   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用