Python嵌套列表None值递增替换:跳过指定值且同首元素值统一
问题需求
需要实现的逻辑如下:
- 将嵌套列表中所有子列表内的
None值替换为从0开始递增的整数 - 替换过程中需排除
skip列表包含的数值 - 附加规则:若多个子列表的首元素相同,则这些子列表中存在的
None值必须替换为同一个数值
用户初始实现代码:
skip = [1,2] a = [[1, None, 2], [3, 4, 5], [1, None, 7], [8, 9, 10],[11, None, 12]] b = 0 d = {} for i in range(len(a)): if a[i][1]==None: if b in skip: print("found b in skip") b = b + 1 if a[i][1] in d.keys(): a[i][1] = d[a[i][1]] else: a[i][1] = b d[a[i][0]] = b b = b + 1 print(d) print(a)
原代码实际运行输出:
found b in skip {1: 2, 11: 3} [[1, 0, 2], [3, 4, 5], [1, 2, 7], [8, 9, 10], [11, 3, 12]]
期望正确输出:
[[1, 0, 2], [3, 4, 5], [1, 0, 7], [8, 9, 10], [11, 3, 12]]
原代码逻辑问题
一共3处核心错误:
- 字典键判断逻辑完全错误
原代码判断a[i][1] in d.keys(),但此时a[i][1]的值是None,永远不可能出现在以子列表首元素为键的字典中,导致首元素相同的后续子列表无法命中已有的映射值,触发重复赋值。 - 字典写入逻辑错误
原代码无论当前首元素是否已有映射,都会执行d[a[i][0]] = b,会覆盖之前已经存储的首元素对应映射值,进一步加剧同首元素赋值不一致的问题。 - 计数器逻辑错误
- 跳过
skip值的判断只执行一次,若skip存在连续值会出现漏判 - 无论当前是复用已有映射值,还是新分配映射值,都会执行
b = b + 1,导致计数器无意义递增,跳过规则失效。
- 跳过
修正后代码
skip = [1, 2] a = [[1, None, 2], [3, 4, 5], [1, None, 7], [8, 9, 10], [11, None, 12]] count = 0 first_elem_map = {} for sub_list in a: # 与原逻辑保持一致,默认None固定出现在子列表索引1位置 if sub_list[1] is None: first_elem = sub_list[0] # 首元素已有映射直接复用,不修改计数器 if first_elem in first_elem_map: sub_list[1] = first_elem_map[first_elem] continue # 循环查找下一个不在skip列表中的有效值 while count in skip: count += 1 # 存储映射、赋值、递增计数器 first_elem_map[first_elem] = count sub_list[1] = count count += 1 print(a)
运行后输出完全符合预期:
[[1, 0, 2], [3, 4, 5], [1, 0, 7], [8, 9, 10], [11, 3, 12]]
内容的提问来源于stack exchange,提问作者npatel
相关产品推荐
相关产品推荐

