【问题标题】:List inside of List Comprehension列表理解中的列表
【发布时间】:2014-03-19 19:49:56
【问题描述】:

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

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

但我想找到的是,从概念上讲,为什么我的第一次理解尝试没有奏效。

【问题讨论】:

  • 解压 l : [a for i, (a, b) in amazing_list]

标签: python list list-comprehension


【解决方案1】:

拆包让你有点得意忘形了。

注意你想要理解的理解

[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 不可迭代。

【讨论】:

  • 这是一个非常清楚的解释。谢谢你!
【解决方案2】:

该列表理解中的l 是一个列表,因此对其进行迭代会产生一个和一个值。而且您不能将其解压缩为两个值。

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

如果你把它放在可以拆包的东西里,它就会起作用。 (l,) 也可以。

[a for a,b in [1, 2]]这基本上是一回事。在这里应该很容易看出为什么不能那样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-25
    • 2014-08-26
    • 2019-08-13
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多