用列表理解拼合元组列表

时间:2019-02-26 10:42:16

标签: python-3.x list-comprehension

为什么下面的列表理解会导致错误?我想念什么?

a = [
[(1, 2), (11, 22), (111, 222)],
[(3, 4), (33, 44), (333, 444)],
[(5, 6), (55, 66), (555, 666)]
]

b = [k for k in j for j in i for i in a]
print(sorted(b))

我知道有更多优雅/可读的解决方案,但这是我的理解。

错误: TypeError:“ int”对象不可迭代

所需的输出: [1、2、3、4、5、6、11、22、33、44、55、66、111、222、333、444、555、666]

2 个答案:

答案 0 :(得分:3)

列表理解中的顺序是错误的。这是正确的解决方案:

In [5]: a = [
   ...: [(1, 2), (11, 22), (111, 222)],
   ...: [(3, 4), (33, 44), (333, 444)],
   ...: [(5, 6), (55, 66), (555, 666)]
   ...: ]
   ...: 
   ...: b = [j for x in a for y in x for j in y]
   ...: 
   ...: 
   ...: 

In [6]: 

In [6]: b
Out[6]: [1, 2, 11, 22, 111, 222, 3, 4, 33, 44, 333, 444, 5, 6, 55, 66, 555, 666]

In [7]: sorted(b) 
Out[7]: [1, 2, 3, 4, 5, 6, 11, 22, 33, 44, 55, 66, 111, 222, 333, 444, 555, 666]

以下是SO讨论,它解释了嵌套列表的理解:Explanation of how nested list comprehension works?

答案 1 :(得分:2)

考虑嵌套列表理解的一种方法是,将它们想象成一个循环写出来,然后从上到下将它们铲起,最后使用开头的最后一行(因为这是我们要打印的内容)。通过这种方式,可以在内存中声明每个变量,从已知变量开始,然后进入每个临时级别。

所以,如果我们有:

for sublist in a:
    for tup in sublist:
        for item in tup:
            print(item)

我们可以将其重写为

[print(item) for sublist in a for tup in sublist for item in tup]

> [1, 2, 11, 22, 111, 222, 3, 4, 33, 44, 333, 444, 5, 6, 55, 66, 555, 666]

(无限等)