如何将列表的列表的元组展开为单个元组列表?
解决方案:扁平化嵌套列表为元组列表
好问题!既然你已经掌握了基础的嵌套循环实现,这里有几种更简洁高效的写法可以达到同样的效果:
1. 列表推导式(最直观的替代方案)
列表推导式本质就是把你的嵌套循环转换成一行代码,逻辑完全一致:
a = [[(1, 2), (3, 4), (5, 6)], [(7, 8), (9, 10)]] b = [t for c in a for t in c] print(b) # 输出: [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
这里的顺序和你写的循环完全对应:先遍历a中的每个子列表c,再遍历c中的每个元组t,把t逐个收集到新列表里。
2. 使用itertools.chain(高效的标准库方案)
Python的itertools模块提供了专门处理可迭代对象的工具,chain可以帮你把多个可迭代对象“链”在一起,非常适合扁平化操作:
from itertools import chain a = [[(1, 2), (3, 4), (5, 6)], [(7, 8), (9, 10)]] # 两种写法都可以: b = list(chain(*a)) # 解包a中的子列表作为chain的参数 # 或者更推荐的写法(不需要解包,适合生成器/大列表): b = list(chain.from_iterable(a)) print(b) # 输出: [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
这个方法的优势是效率更高,尤其是当你的嵌套列表非常大的时候,它不会像列表推导式那样一次性生成所有元素(当然转成列表还是会的,但chain本身是惰性迭代的)。
3. 用sum的小技巧(最简短但不推荐大数据量)
如果你追求极致的简短,可以用sum函数来拼接列表:
a = [[(1, 2), (3, 4), (5, 6)], [(7, 8), (9, 10)]] b = sum(a, []) print(b) # 输出: [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
原理是sum会把a中的每个子列表和初始值[]依次相加(列表相加就是拼接)。但要注意:这个方法对于大列表来说效率很低,因为每次列表相加都会创建一个新的列表,数据量越大性能越差,所以只适合小数据量的场景。
内容的提问来源于stack exchange,提问作者torayeff
相关产品推荐
相关产品推荐

