列出清单内容列表

时间:2014-03-19 19:49:56

标签: python list list-comprehension

所以,我从这段代码开始:

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]]

但我想要找到的是,为什么从概念上讲,我对理解的第一次尝试不起作用。

2 个答案:

答案 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]]这基本上是一回事。在这里应该很容易理解为什么不能这样做。