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

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1006  
  华为作为全球领先的科技公司,其成功的关键之一在于其高效的研发管理体系——集成产品开发(IPD)。IPD不仅仅是一套流程工具,更是一种团队协作与文化融合的实践体系。通过IPD,华为将跨部门的资源、能力和智慧有效整合,实现了从产品概念到市场交付的全流程高效运作。IPD的核心在于打破传统职能部门的壁垒,强调团队协作与文化的深...
IPD集成产品开发流程   0  
  创新是企业持续发展的核心驱动力,而集成产品开发(IPD, Integrated Product Development)作为一种先进的管理方法,能够帮助企业实现从产品概念到市场落地的全流程优化。通过系统化的流程设计和跨职能团队的协同合作,IPD不仅能够提升开发效率,还能显著降低风险,确保产品在市场上具备竞争力。许多企业...
华为IPD流程   0  
  在快速变化的市场中,企业面临着缩短产品上市时间的巨大压力。消费者需求的多样化和技术的迅猛发展,使得产品生命周期日益缩短。企业必须更快地推出新产品,以抢占市场先机并满足客户期望。然而,传统的产品开发流程往往效率低下,难以应对这种挑战。集成产品开发(IPD)流程作为一种系统化的产品开发方法,能够帮助企业在确保质量的同时,显...
IPD培训课程   0  
  研发IPD(Integrated Product Development,集成产品开发)流程是企业实现高效产品开发的核心方法论之一。它通过跨部门协作、并行工程和结构化流程,确保产品从概念到市场的高效交付。然而,在IPD流程中,绩效评估与改进方法的设计与实施往往成为企业面临的重大挑战。由于研发活动的复杂性和不确定性,传统...
IPD流程分为几个阶段   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用