Python如何优雅实现不等长列表组的逐元素拼接,无需嵌套for循环?
Python实现不等长子列表按位置拼接方案
可以直接使用Python标准库itertools提供的工具完成需求,无需手写嵌套for循环:
兼容所有元素的通用实现
如果列表中可能包含None值,建议使用自定义哨兵值避免误判:
from itertools import zip_longest, chain lol = [[1,2,3,4],[5,6],[7,8,9,0,11],[21]] # 自定义唯一哨兵值,不会和列表内任何原有元素冲突 SENTINEL = object() cl = list(filter(lambda x: x is not SENTINEL, chain.from_iterable(zip_longest(*lol, fillvalue=SENTINEL))))
简化实现(列表无None时可用)
如果可以确定列表中不存在None值,可以直接省略自定义哨兵逻辑:
from itertools import zip_longest, chain lol = [[1,2,3,4],[5,6],[7,8,9,0,11],[21]] cl = [elem for elem in chain(*zip_longest(*lol)) if elem is not None]
实现原理
zip_longest(*lol, fillvalue=xxx)会按索引位置对齐所有子列表的元素,长度不足的子列表用填充值补全,针对示例生成的分组依次为(1,5,7,21)、(2,6,8, 填充值)、(3,填充值,9,填充值)等chain.from_iterable将所有分组的元素依次展开为一维迭代器- 最后过滤掉所有填充值,即可得到按位置拼接的结果列表
内容的提问来源于stack exchange,提问作者Sharath
相关产品推荐
相关产品推荐

