如何用列表推导式扁平化嵌套列表?itertools与列表推导式孰优?
问题解答
更优的列表推导实现
你可以用两种更简洁高效的列表推导方式实现,无需嵌套推导:
1. 直接提取返回值的唯一元素
既然foo(x)固定返回单元素列表,直接取索引[0]即可:
[foo(x)[0] for x in range(10) if x%2 == 0]
这种写法避免了生成中间嵌套列表,比你之前的嵌套推导更高效,代码也更简洁。
2. 扁平式列表推导(兼容多元素返回场景)
如果未来foo可能返回多元素列表,用双层循环的列表推导可以自动扁平化结果:
[j for x in range(10) if x%2 == 0 for j in foo(x)]
这种写法利用了foo(x)的可迭代特性,即使返回列表长度变化,代码也能正常工作。
列表推导 vs itertools.chain.from_iterable:最佳实践
- 简单单层嵌套场景:优先用列表推导(上面两种方式),无需额外导入模块,代码直观易读,小规模数据下性能足够。
- 复杂嵌套/大数据场景:
itertools.chain.from_iterable更合适,它是惰性迭代,不会生成中间嵌套列表,能节省内存;当嵌套层级多或结构复杂时,用chain的代码比多层列表推导更简洁。
你之前的嵌套推导写法会先生成完整的中间嵌套列表,再遍历生成结果,多了一步内存开销,因此更推荐上面两种优化后的写法。
内容的提问来源于stack exchange,提问作者SteveS
相关产品推荐
相关产品推荐

