Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表理解中的列表_Python_List_List Comprehension - Fatal编程技术网

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)在惊人的列表中]
这是一个非常清楚的解释。谢谢你!