You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中合并多子列表并保留非零值的最优方法

Python合并列表保留非0/非空值的最优方法

需求说明

将多个长度相同的子列表按位置合并,每个位置保留非0元素(空字符串''不属于0,需保留),最终得到一个合并后的子列表。

原数据

original_list = [
    [0, 0, 0, '', 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 'b', 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 'c', 0, 0],
    [0, 0, 0, 0, 0, 0, 0, '', 0],
    [0, 0, 0, 0, 0, 0, 0, 0, '']
]

最优解法:zip + 生成器表达式

这是最简洁高效的实现方式,利用惰性求值提前终止遍历,性能最优:

# 合并逻辑:遍历每个位置的元素组,取第一个非0元素
merged = [next(item for item in group if item != 0) for group in zip(*original_list)]
# 包装成目标格式的列表
result = [merged]

print(result)
# 输出:[[0, 0, 0, '', 'b', 0, 'c', '', '']]

逻辑解释

  1. zip(*original_list):将原列表转置,把每个位置的所有元素打包成一个元组(比如第一个元组是(0,0,0,0,0),第四个元组是('',0,0,0,0))。
  2. next(item for item in group if item != 0):对每个位置的元素组,遍历找到第一个不等于0的元素,因为原数据每个位置仅存在一个非0/非空元素,刚好匹配需求。
  3. 若担心某些位置全为0的情况,可以添加默认值兜底:
merged = [next((item for item in group if item != 0), 0) for group in zip(*original_list)]

备选方法:filter + 生成器

如果偏好filter语法,也可以这样实现,性能和上面的方法接近:

merged = [next(filter(lambda x: x != 0, group), 0) for group in zip(*original_list)]
result = [merged]

效率说明

上述方法的时间复杂度为O(n*m)(n是子列表数量,m是子列表长度),但由于生成器的惰性特性,每个位置的遍历会在找到第一个符合条件的元素后立即停止,实际运行效率比遍历所有元素的方法更高,同时代码简洁易读,是这类场景的最优选择。

内容的提问来源于stack exchange,提问作者rafaelcb21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:13:19