Python实现嵌套列表合并:替换None值生成指定顺序单列表
解决嵌套列表按位置合并提取非None元素的问题
看起来你需要把嵌套列表中每个位置的非None元素按特定顺序提取出来,合并成一个单列表。根据你的示例,核心逻辑是:对于结果列表的每个索引位置,从最后一个子列表往第一个子列表查找,取第一个遇到的非None值——这样就能完美匹配你要的输出。
代码实现
这里用Python给出两种实现方式,第一种更直观易读,第二种更简洁紧凑:
方式一:分步遍历(清晰易懂)
temp_lst = [ [None, None, None, None, None, None, None, '51', '51', '19'], [None, None, None, '55', '55', '55', '55', None, None, None], ['23', '23', '55', None, None, None, None, None, None, None] ] result = [] # 确定子列表的长度(假设所有子列表长度一致) list_length = len(temp_lst[0]) for idx in range(list_length): # 从最后一个子列表开始往前遍历,优先取靠后的子列表的非None值 for sublist in reversed(temp_lst): current_val = sublist[idx] if current_val is not None: result.append(current_val) break # 找到目标值就停止当前位置的查找 print(result) # 输出: ['23', '23', '55', '55', '55', '55', '55', '51', '51', '19']
方式二:列表推导式(简洁高效)
利用next()函数直接获取第一个符合条件的元素,代码更紧凑:
temp_lst = [ [None, None, None, None, None, None, None, '51', '51', '19'], [None, None, None, '55', '55', '55', '55', None, None, None], ['23', '23', '55', None, None, None, None, None, None, None] ] list_length = len(temp_lst[0]) result = [ next(sublist[idx] for sublist in reversed(temp_lst) if sublist[idx] is not None) for idx in range(list_length) ] print(result) # 输出和上面完全一致
思路说明
- 前提假设:所有子列表的长度相同(这是你的示例隐含的条件),我们先获取这个长度作为结果列表的固定长度。
- 逆序遍历逻辑:对每个索引位置,从最后一个子列表开始往前找,这样会优先提取最后一个子列表的非None值(对应结果的前3个元素),接着是倒数第二个子列表的非None值(对应结果中间4个
55),最后是第一个子列表的非None值(对应结果最后3个元素)。 - 灵活调整:如果某个位置存在多个子列表有非None值,当前逻辑会取最后出现的子列表中的值;若需要取第一个出现的,去掉代码中的
reversed()即可。
内容的提问来源于stack exchange,提问作者Angolababa
相关产品推荐
相关产品推荐

