列表推导中的列表

3 投票
2 回答
924 浏览
提问于 2025-04-17 23:01

我开始写这段代码:

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

在这个列表推导式中,l 是一个单独的列表,所以当你去遍历它的时候,只能得到一个一个的值。而你不能把这个值拆分成两个。

print [a for i, l in amazing_list for a,b in [l]]

如果你把它放进一个可以拆分的结构里,那就可以正常工作了。比如 (l,) 也可以。

[a for a,b in [1, 2]] 其实和这个是差不多的。在这里,你应该很容易理解为什么不能这样做。

3

你在解包的时候有点过于复杂了。

注意你想要理解的这个表达式

[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 不是一个可迭代的对象。

撰写回答