Python3中如何交错合并多个可变长度列表?
Python3中交错合并多个可变长度列表的正确方法
刚好碰到过类似的问题,Python3里用itertools.zip_longest就能完美解决你的需求,它就是专门用来替代Python2中map(None)处理不等长序列的工具。
先看针对你给出的示例的完整代码:
from itertools import zip_longest l1=[1,2,3] l2=[10,20,30] l3=[101,102,103,104] # 交错合并并过滤掉填充的None merged_list = [y for x in zip_longest(l1, l2, l3) for y in x if y is not None] print(merged_list) # 输出结果: [1, 10, 101, 2, 20, 102, 3, 30, 103, 104]
为什么这个方法可行?
zip_longest会遍历所有输入列表,直到最长的那个列表元素耗尽,对于较短列表中缺失的位置,默认用None来填充(你也可以通过fillvalue参数指定其他填充值)。- 之后通过列表推导式,我们把打包后的元组扁平化,同时过滤掉用来填充的
None,就得到了和Python2中map(None)完全一致的效果。
为什么你的lambda方法会截断?
你写的map(func,l1,l2,l3)其实等价于内置的zip(l1,l2,l3)——zip会在最短的列表元素耗尽后就停止遍历,所以才会出现截断的问题,而zip_longest正好补上了这个短板。
额外小提示
如果你的列表中本身就包含None作为有效元素,可以指定一个不会和列表元素冲突的填充值,比如:
merged_list = [y for x in zip_longest(l1, l2, l3, fillvalue='__FILL__') for y in x if y != '__FILL__']
内容的提问来源于stack exchange,提问作者Goods
相关产品推荐
相关产品推荐

