gpt4 book ai didi

Python 列表理解循环

转载 作者:太空狗 更新时间:2023-10-29 17:03:13 26 4
gpt4 key购买 nike

我正在阅读 the Python wikibook并对这部分感到困惑:

List comprehension supports more than one for statement. It willevaluate the items in all of the objects sequentially and will loopover the shorter objects if one object is longer than the rest.

>>> item = [x+y for x in 'cat' for y in 'pot']
>>> print item
['cp', 'co', 'ct', 'ap', 'ao', 'at', 'tp', 'to', 'tt']

我了解嵌套 for 循环的用法,但我不明白

...and will loopover the shorter objects if one object is longer than the rest

这是什么意思? (更短,更长......)

最佳答案

这些类型的嵌套循环创建了一个 Cartesian Product的两个序列。试一试:

>>> [x+y for x in 'cat' for y in 'potty']
['cp', 'co', 'ct', 'ct', 'cy', 'ap', 'ao', 'at', 'at', 'ay', 'tp', 'to', 'tt', 'tt', 'ty']
>>> [x+y for x in 'catty' for y in 'pot']
['cp', 'co', 'ct', 'ap', 'ao', 'at', 'tp', 'to', 'tt', 'tp', 'to', 'tt', 'yp', 'yo', 'yt']

上面列表理解中的inner 'x'(即,for x in 'cat' 部分)与outer for x in 'cat': 在这个例子中:

>>> li=[]
>>> for x in 'cat':
... for y in 'pot':
... li.append(x+y)
# li=['cp', 'co', 'ct', 'ap', 'ao', 'at', 'tp', 'to', 'tt']

因此,使一个更短或更长的效果与在两个嵌套循环中使“x”或“y”循环变长的效果相同:

>>> li=[]
>>> for x in 'catty':
... for y in 'pot':
... li.append(x+y)
...
>>> li==[x+y for x in 'catty' for y in 'pot']
True

在每种情况下,较短的序列都会再次循环,直到用完较长的序列。这与 zip 不同,后者的配对将在较短序列的末尾终止。

编辑

似乎(在评论中)混淆了嵌套循环与 zip。

嵌套循环:

如上所示,这个:

[x+y for x in '12345' for y in 'abc']

与两个嵌套的“for”循环相同,“x”是外层循环。

嵌套循环会在外层循环时间内执行 y 范围内的 x 循环。

所以:

>>> [x+y for x in '12345' for y in 'ab']
['1a', '1b', # '1' in the x loop
'2a', '2b', # '2' in the x loop, b in the y loop
'3a', '3b', # '3' in the x loop, back to 'a' in the y loop
'4a', '4b', # so on
'5a', '5b']

您可以使用 product 获得相同的结果来自 itertools:

>>> from itertools import product
>>> [x+y for x,y in product('12345','ab')]
['1a', '1b', '2a', '2b', '3a', '3b', '4a', '4b', '5a', '5b']

Zip 类似但在较短的序列用完后停止:

>>> [x+y for x,y in zip('12345','ab')]
['1a', '2b']
>>> [x+y for x,y in zip('ab', '12345')]
['a1', 'b2']

您可以使用 itertools对于将压缩直到最长序列用完的 zip,但结果不同:

>>> import itertools
>>> [x+y for x,y in itertools.zip_longest('12345','ab',fillvalue='*')]
['1a', '2b', '3*', '4*', '5*']

关于Python 列表理解循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18649884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com