Python 列表理解中的列表
因此,我从以下代码开始:Python 列表理解中的列表,python,list,list-comprehension,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] print [a for i, l in amazing_list for a in l] 按预
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]
print [a for i, l in amazing_list for a in l]
按预期打印[[2,3],[5,6],[8,9]
print [l for i, l in amazing_list]
print [a for i, l in amazing_list for a in l]
按预期打印[2,3,5,6,8,9]
但这里是关键,这里是一些不被期望的东西:我试图用我将要展示的下一行代码来完成的是,我只是试图打印2,5,8(列表中的第一个元素):
但这会打印TypeError:“int”对象不可编辑。为什么?
我知道这些都能实现我想要实现的目标:
print [l[0] for i, l in amazing_list]
print [a for a, b in [l for i, l in amazing_list]]
但我想找到的是,从概念上讲,我第一次尝试理解失败的原因。列表理解中的l
是一个列表,因此对它进行迭代会产生一个和一个值。你不能把它分解成两个值
print [a for i, l in amazing_list for a,b in [l]]
如果你把它放进可以打开的东西里,它就会工作<代码>(l,)
也可以工作
[a代表a,b在[1,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是不可移植的。只要打开
l
:[a代表i,(a,b)在惊人的列表中]
这是一个非常清楚的解释。谢谢你!