基于上一行迭代更新列表中False值的异常问题排查
问题分析与解决
场景描述
我们有如下嵌套列表:
original_list = [ ['col1', False, False, False, False, False], ['col1', 'col2', False, False, False, False], ['col1', False, 'col3a', False, False, False], ['col1', False, 'col3b', False, False, False], ['col1', False, False, 'col4', False, False], ['col1', False, False, 'col4', False, False] ]
需求是:遍历每一行时,若当前位置元素为False,且上一行相同位置元素不为False,则将当前元素替换为上一行对应元素,最终得到如下结果:
desired_list = [ ['col1', False, False, False, False, False], ['col1', 'col2', False, False, False, False], ['col1', 'col2', 'col3a', False, False, False], ['col1', 'col2', 'col3b', False, False, False], ['col1', 'col2', 'col3b', 'col4', False, False], ['col1', 'col2', 'col3b', 'col4', False, False], ]
用户编写的代码仅修改了部分值,无法达到预期效果,比如第三行第二列的False被替换为col2后,第四行同位置的False没有使用这个更新后的值进行替换。
问题根源
你的代码存在两个核心问题:
- 未将修改结果同步回数据源:每次循环新建
display_list存储当前行的修改结果,但仅打印该列表,没有把它更新到原list_of_lists中。 - 基于原始旧数据计算后续行:后续行的判断依然使用原列表里未修改的旧行数据,比如第四行取第三行数据时,原列表中第三行第二列还是
False,而非修改后的col2,因此无法完成正确替换。
修正方案
我们需要确保后续行的计算基于已经更新后的上一行数据,以下两种方案均可实现需求:
方案一:直接修改原列表
list_of_lists = [ ['col1', False, False, False, False, False], ['col1', 'col2', False, False, False, False], ['col1', False, 'col3a', False, False, False], ['col1', False, 'col3b', False, False, False], ['col1', False, False, 'col4', False, False], ['col1', False, False, 'col4', False, False] ] # 从第二行开始遍历(第一行无需处理) for row_num in range(1, len(list_of_lists)): current_row = list_of_lists[row_num] prev_row = list_of_lists[row_num - 1] for col_num in range(len(current_row)): if current_row[col_num] == False and prev_row[col_num] != False: current_row[col_num] = prev_row[col_num] # 打印最终结果 for row in list_of_lists: print(row)
方案二:新建结果列表(不修改原列表,更安全)
original_list = [ ['col1', False, False, False, False, False], ['col1', 'col2', False, False, False, False], ['col1', False, 'col3a', False, False, False], ['col1', False, 'col3b', False, False, False], ['col1', False, False, 'col4', False, False], ['col1', False, False, 'col4', False, False] ] # 初始化结果列表,第一行直接复制原列表的第一行 result = [original_list[0].copy()] # 遍历剩余行 for row in original_list[1:]: new_row = row.copy() # 取结果列表中最后一行(即已经更新后的上一行) prev_row = result[-1] for col_idx in range(len(new_row)): if new_row[col_idx] == False and prev_row[col_idx] != False: new_row[col_idx] = prev_row[col_idx] result.append(new_row) # 打印最终结果 for r in result: print(r)
验证结果
两种方案都会输出符合预期的结果:
['col1', False, False, False, False, False] ['col1', 'col2', False, False, False, False] ['col1', 'col2', 'col3a', False, False, False] ['col1', 'col2', 'col3b', False, False, False] ['col1', 'col2', 'col3b', 'col4', False, False] ['col1', 'col2', 'col3b', 'col4', False, False]
内容的提问来源于stack exchange,提问作者dimButTries
相关产品推荐
相关产品推荐

