所以,我从这段代码开始:
x = [1, [2, 3]]
y = [4, [5, 6]]
z = [7, [8, 9]]
amazing_list = [x, y, z]
我对它做了一个简单的列表理解
print [l for l in amazing_list]
按预期打印[[1, [2, 3]], [4, [5, 6]], [7, [8, 9]]]
print [l for i, l in amazing_list]
按预期打印[[2, 3], [5, 6], [8, 9]]
print [a for i, l in amazing_list for a in l]
按预期打印[2, 3, 5, 6, 8, 9]
,
但接下来是踢球者,这里有些东西没有被预料到:我要用下一行代码完成的目的是我要尝试打印2,5,8 (列表中列表的第一个元素):
print [a for i, l in amazing_list for a, b in l]
但这会打印TypeError: 'int' object is not iterable
。为什么呢?
我知道这些完成了我想要完成的事情:
print [l[0] for i, l in amazing_list]
print [a for a, b in [l for i, l in amazing_list]]
但我想要找到的是,为什么从概念上讲,我对理解的第一次尝试不起作用。
答案 0 :(得分:2)
你打开包装后会有点不知所措。
请注意您正在尝试理解的理解
[a for i, l in amazing_list for a, b in l]
在逻辑上等同于以下内容:
tmp = []
for i, l in amazing_list:
for a, b in l:
tmp.append(a)
结果位于tmp
。
让我们看看最里面的for
循环。当您收到错误消息时,l
等于[2, 3]
。
口译员告诉你
for a, b in [2, 3]:
print a
不会去上班。为什么a
等于2且b
等于3?那么,如果你这样做会怎么样:
for x in [2, 3]:
print x
会发生什么?第一次通过,x
等于2.第二次通过,x
等于3.请注意,在循环的每次迭代中,您只是得到一个整数。因此,如果您在代码中将x
替换为a, b
,那么第一次通过循环时,解释器会尝试执行以下分配:
a, b = 2
然后失败,因为2不可迭代。
答案 1 :(得分:0)
列表推导中的l
是一个列表,因此迭代它会产生一个和一个值。而你无法将其解压缩为两个值。
print [a for i, l in amazing_list for a,b in [l]]
如果你将它放入可以解压缩的东西中,它就会起作用。 (l,)
也可以。
[a for a,b in [1, 2]]
这基本上是一回事。在这里应该很容易理解为什么不能这样做。