用列表解析将元组的嵌套列表压平

5
为什么下面的列表推导会出错?我漏掉了什么吗?
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]


可能是重复的问题:如何将列表中的列表变成平面列表? - mkrieger1
2个回答

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讨论:如何理解嵌套列表推导


3

嵌套列表推导式的一种思考方式是将其想象为一个循环,然后从上到下收集它们,最后使用最后一行作为开头(因为这是我们要打印的内容)。这样每个变量都会在内存中声明,从已知开始,逐渐移动到每个临时级别。

所以如果我们有:

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]

(等等,不断重复)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接