列表推导中的列表
我开始写这段代码:
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 不是一个可迭代的对象。