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', '', '']]
逻辑解释
zip(*original_list):将原列表转置,把每个位置的所有元素打包成一个元组(比如第一个元组是(0,0,0,0,0),第四个元组是('',0,0,0,0))。next(item for item in group if item != 0):对每个位置的元素组,遍历找到第一个不等于0的元素,因为原数据每个位置仅存在一个非0/非空元素,刚好匹配需求。- 若担心某些位置全为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
相关产品推荐
相关产品推荐

