簡體   English   中英

python 3.x 中不同列表理解的輸出

[英]outputs of different list comprehensions in python 3.x

我正在研究 Python 中的列表理解,我很困惑為什么這兩個代碼會產生不同的輸出。 代碼:

print([(letter,num) for letter in 'abc' for num in range(2)])
print([((letter,num) for letter in 'abc') for num in range(2)])

OUTPUT:

[('a', 0), ('a', 1), ('a', 2), ('a', 3), ('b', 0), ('b', 1), ('b', 2), ('b', 3), ('c', 0), ('c', 1), ('c', 2), ('c', 3), ('d', 0), ('d', 1), ('d', 2), ('d', 3)]

[<generator object <listcomp>.<genexpr> at 0x000002919E020F20>, <generator object <listcomp>.<genexpr> at 0x000002919E148C10>, <generator object <listcomp>.<genexpr> at 0x000002919E1489E0>, <generator object <listcomp>.<genexpr> at 0x000002919E148C80>]

第一個例子:

print([(letter,num) for letter in 'abc' for num in range(2)])

打印一個列表(因為外部[]括號),其中包含 letter 和num的所有元組(因為letterletter, num周圍的括號),每個letter的值在'abc'上循環, num的每個值在每個值上循環range(2)返回的生成器的值(將是01 )。

由於 Python 將第一個for作為外循環,因此您會看到('a', 0), ('a', 1),等,而不是('a', 0), ('b', 0),等.

但是,當您在for表達式(如(letter,num) for letter in 'abc'周圍添加括號時,您不再在理解中執行循環,而是捕獲生成器(准備開始產生它們的值,但實際上並沒有將值納入理解中)。

所以:

print([((letter,num) for letter in 'abc') for num in range(2)])

在這里, ((letter,num) for letter in 'abc')只是一個生成器,一旦你開始請求它們就會產生值。

注意:因為num的值沒有單獨包含在生成器中,如果你對它們做一些事情,你可能會看到一個令人驚訝的結果:

x = [((letter,num) for letter in 'abc') for num in range(2)]
print(next(x[0]))
print(next(x[0]))
print(next(x[0]))
print(next(x[1]))
print(next(x[1]))
print(next(x[1]))

結果:

('a', 1)
('b', 1)
('c', 1)
('a', 1)
('b', 1)
('c', 1)

第一個列表推導等效於嵌套循環:

result = []
for num in range(2):
    for letter in 'abc':
        result.append((letter, num))
print(result)

嵌套循環的每次迭代都會產生結果列表的一個元素。

第二個相當於一個循環:

result = []
for num in range(2):
    result.append((letter, num) for letter in 'abc')
print(result)

循環的每次迭代都會將生成器 object 附加到結果列表中。

您可以使用嵌套列表推導,但結果將是嵌套列表,而不是第一個版本中的平面列表。

print([list((letter,num) for letter in 'abc') for num in range(2)])
# output: [[('a', 0), ('b', 0), ('c', 0)], [('a', 1), ('b', 1), ('c', 1)]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM