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

2024-12-19 09:23:00
admin
原创
139
摘要:问题描述:我看到了一些类似的代码: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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用