提问人:Funnyone 提问时间:8/16/2023 最后编辑:Funnyone 更新时间:8/16/2023 访问量:68
[string for i, string in enumerate(a)] 在 python 中如何工作?
How does [string for i, string in enumerate(a)] work in python?
问:
谢谢你帮助我!@juanpa.arrivillaga 在评论中回答了我的问题。我问题的关键点是关于 python 如何知道“我试图将第一个元素分配给 i,将第二个元素分配给字符串”。
我正在学习 python,但工作方式真的让我感到困扰。[string for i, string in enumerate(a)]
这是我在学习 python 时编写的 2 个示例代码
a = ['a','b','c', 'd']
d = [string for string in enumerate(a)]
print (d)
它将返回 '[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]'。但是,如果我编写以下代码
a = ['a','b','c', 'd']
c = [string for i, string in enumerate(a)]
print(c)
它会回来的['a', 'b', 'c', 'd']
在我的理解中,将转换为“枚举对象”,例如RAM内的位置。而且我没有告诉 python i 是什么(我没有告诉 python 是索引或字符串是元素)。因此,代码将被解释为“list[”enumerated object“ iterate inside ”i“]”,但由于我没有告诉python我是什么,所以它会遇到错误。但是,它从 enumerate 返回了一个元素列表。string in enumerate(a)
i
python 从哪里从我的代码中学到了枚举中的平均值和索引的均值?string
element
i
答:
enumerate(a)
给你,依此类推。在你的第一个代码中,你的字符串是,这就是你得到的。(0, 'a')
(1, 'b')
(0, 'a')
在第二个代码中是 (迭代数字 - 0、1 等) 的第一个元素,是第二个元素(即原始列表的元素)。你只在你的列表中,所以你只得到第二个元素,它们是原始列表的元素,这会产生原始列表。i
(0, 'a')
string
string
(我没有告诉python是索引或字符串是元素)
i
你真的做到了。尝试以下操作并注意其中的区别:
c = [(i, string) for i, string in enumerate(a)]
print(c)
c = [(string, i) for i, string in enumerate(a)]
print(c)
评论
enumerate
[for i, x in range(10)]
i
string
i
string
因为 enumerate(a) 返回格式为 (index, value_of_index) 的元组的迭代器
第一种情况:'string for string in enumerate(a)',元组(index, value_of_index)存储在变量“string”中,您将其保存在列表“d”中,为您提供元组作为输出。
第二种情况:“i 的字符串,enumerate(a)) 中的字符串”,索引存储在变量 'i' 中,value_of_index存储在 'string' 中,您将 'string' 保存在列表 'c' 中,仅提供列表 'a' 中的值。
评论
所以,你需要了解两件事。首先,什么是,其次,可迭代的解包是如何工作的。enumerate
enumerate
将可迭代对象作为它的第一个参数和一个关键字参数(如果没有显式传递,则默认为)。它返回一个对的迭代器,即长度为 2 的元组,其中第一个元素是 s 开始并增加 1,第二个元素来自您传递给的原始可迭代对象。start
0
int
start
enumerate
>>> iterable = ["foo", "bar", "baz"]
>>> iterator = enumerate(iterable, start=1)
>>> next(iterator)
(1, 'foo')
>>> next(iterator)
(2, 'bar')
>>> list(iterator)
[(3, 'baz')]
现在,您需要了解赋值目标中的可迭代解包。请注意,在 for 循环或列表推导式(或字典/集合推导式或生成器表达式)的子句中,您正在分配给目标。所以:for
>>> for x in range(4):
... print(x)
...
0
1
2
3
>>> print("see, x is just a regular variable", x)
see, x is just a regular variable 3
因为,在每次迭代开始时,您都会从子句中的可迭代对象创建的迭代器中获取下一个值。任何进入:in
for <assignment target> in iterable
也可以去:
<assignment target> = whatever
但是,赋值目标可以不仅仅是一个简单的单一变量。最简单的扩展,解压缩为两个变量:
>>> x = 3
>>> x, y = "XY"
>>> x
'X'
>>> y
'Y'
>>> x, y = range(2)
>>> x
0
>>> y
1
>>> x, y = ['foo', 'bar']
>>> x
'foo'
>>> y
'bar'
它可以比这更复杂,但我想你已经明白了。
所以你是在告诉 Python:for i, string in whatever
我希望每个元素(本身就是一个可迭代的)都是一些正好有两个元素的可迭代元素。在每次迭代中,将第一项分配给 ,将第二项分配给 。这只是基于位置,名称无关紧要。它们可能是,它的工作方式完全相同。whatever
i
string
for banana, apple in whatever
上一个:重写自定义类的枚举
评论
string
i
i
string
enumerate
a = (3, 4, 5)
a, b, c = (3, 4, 5)
for i, string in whatever
whatever
i
string
for banana, apple in enumerate(a): print(banana, apple)
a, b, c = (3, 4, 5)