Python for-in 循环前面有一个变量[重复]
- 2024-12-19 09:23:00
- admin 原创
- 70
问题描述:
我看到了一些类似的代码:
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
可以是list
、set
或dict
任何其他可迭代对象
以下是一个澄清的例子
>>> 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 通过列表推导内置了方法,可以更简洁、更简化地处理这个问题。我只需编写一行代码,而不必实现两个完整的类和几个方法。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件