如何用特定序列替换二级列表中的重复值?(Python)
问题描述
现有二维列表:
elements = [ [7, 3, 9, 6], [5, 7, 9, 6], [9, 8, 1, 4], [3, 9, 4, 7], ]
需要按以下规则修改列表:
- 找出整个列表的最大值,从这个值的下一个数开始生成递增序列
- 对每个子列表中在全局范围内重复出现的数值,保留第一次出现的实例,后续出现的按元素从小到大的顺序,替换为上述递增序列中的值
最终修改后的列表要求如下:
[ [7, 3, 9, 6], [5, 12, 14, 11], [15, 8, 1, 4], [10, 16, 4, 13], ]
我尝试过遍历列表,但没能完成这个任务。
解决方案
直接上可运行的Python代码,逻辑注释已嵌入代码:
elements = [ [7, 3, 9, 6], [5, 7, 9, 6], [9, 8, 1, 4], [3, 9, 4, 7], ] # 统计每个元素的出现次数、首次出现位置及需替换的后续位置 from collections import defaultdict element_stats = defaultdict(lambda: {"count": 0, "first_pos": None, "replace_pos": []}) for row_idx, row in enumerate(elements): for col_idx, num in enumerate(row): element_stats[num]["count"] += 1 # 记录首次出现的位置 if element_stats[num]["first_pos"] is None: element_stats[num]["first_pos"] = (row_idx, col_idx) else: # 后续出现的位置标记为需要替换 element_stats[num]["replace_pos"].append((row_idx, col_idx)) # 获取全局最大值,确定替换序列的起始值 global_max = max(num for row in elements for num in row) current_val = global_max + 1 # 按元素从小到大排序,依次替换后续出现的重复值 for num in sorted(element_stats.keys()): stats = element_stats[num] # 仅处理出现次数大于1的元素 if stats["count"] > 1: for pos in stats["replace_pos"]: elements[pos[0]][pos[1]] = current_val current_val += 1 # 打印结果 print("[") for row in elements: print(f" {row},") print("]")
逻辑说明
- 遍历整个列表,统计每个元素的出现情况:第一次出现的位置保留,之后出现的位置记录下来等待替换
- 找到列表全局最大值,从
最大值+1开始生成递增的替换序列 - 把所有元素按从小到大排序,给每个重复元素的后续出现位置依次分配递增的替换值,确保替换顺序符合要求
内容的提问来源于stack exchange,提问作者Владислав Петрушин
相关产品推荐
相关产品推荐

