为嵌套列表中每个元素分配唯一递增编号(保留原结构)
为嵌套列表元素分配唯一递增编号的解决方案
问题描述
现有嵌套列表:
data = [ [0, 1, 2, 1, 1, 2, 3, 1, 2, 0, 2, 1, 4, 3, 2, 4, 4, 4, 0, 0, 2, 2, 2, 2, 5, 5, 3, 4, 0, 0, 4, 2, 5, 2, 3], [2, 0, 0, 2, 3, 2, 3, 0, 1, 4, 3, 3, 0, 0, 0, 0, 3, 2, 0, 1, 4, 5, 5, 3, 3, 1, 3, 4, 3, 0, 0, 5, 1, 4, 5], [0, 1, 2, 0, 3, 2, 0, 4, 3, 1, 3, 1, 1, 2, 4, 0, 2, 3, 1, 4, 3, 4, 1, 5, 3, 0, 5, 3, 3, 4, 2, 3, 1, 5, 5] ]
需求:为列表中每个元素分配唯一递增且无重复的编号,编号按行优先遍历顺序(先遍历第一个子列表的所有元素,再第二个,以此类推)生成,同时必须保留原嵌套列表的结构,不能扁平化。
用户尝试使用嵌套enumerate循环但未成功,以下是可行的解决方案。
解决方案
方法1:手动维护计数器变量
初始化一个计数器,从指定起始值(默认0)开始,逐层遍历嵌套列表,用计数器值替换每个元素后自增计数器。这种方法逻辑直观,适合理解基础遍历逻辑:
data = [ [0, 1, 2, 1, 1, 2, 3, 1, 2, 0, 2, 1, 4, 3, 2, 4, 4, 4, 0, 0, 2, 2, 2, 2, 5, 5, 3, 4, 0, 0, 4, 2, 5, 2, 3], [2, 0, 0, 2, 3, 2, 3, 0, 1, 4, 3, 3, 0, 0, 0, 0, 3, 2, 0, 1, 4, 5, 5, 3, 3, 1, 3, 4, 3, 0, 0, 5, 1, 4, 5], [0, 1, 2, 0, 3, 2, 0, 4, 3, 1, 3, 1, 1, 2, 4, 0, 2, 3, 1, 4, 3, 4, 1, 5, 3, 0, 5, 3, 3, 4, 2, 3, 1, 5, 5] ] # 初始化计数器,若需从1开始编号改为counter = 1 counter = 0 result = [] for sublist in data: new_sublist = [] for _ in sublist: new_sublist.append(counter) counter += 1 result.append(new_sublist) # 输出结果 print(result)
方法2:使用itertools.count自动生成编号
利用Python标准库itertools.count生成一个无限递增的迭代器,无需手动维护计数器,代码更简洁高效:
import itertools data = [ [0, 1, 2, 1, 1, 2, 3, 1, 2, 0, 2, 1, 4, 3, 2, 4, 4, 4, 0, 0, 2, 2, 2, 2, 5, 5, 3, 4, 0, 0, 4, 2, 5, 2, 3], [2, 0, 0, 2, 3, 2, 3, 0, 1, 4, 3, 3, 0, 0, 0, 0, 3, 2, 0, 1, 4, 5, 5, 3, 3, 1, 3, 4, 3, 0, 0, 5, 1, 4, 5], [0, 1, 2, 0, 3, 2, 0, 4, 3, 1, 3, 1, 1, 2, 4, 0, 2, 3, 1, 4, 3, 4, 1, 5, 3, 0, 5, 3, 3, 4, 2, 3, 1, 5, 5] ] # 创建从0开始的递增迭代器,start参数可指定起始编号(如start=1) count_iter = itertools.count(start=0) # 列表推导式生成结果,保留原嵌套结构 result = [[next(count_iter) for _ in sublist] for sublist in data] # 输出结果 print(result)
关键说明
- 两种方法均严格遵循行优先的遍历顺序分配编号,完全保留原嵌套列表的结构。
- 起始编号可灵活调整:手动计数器直接修改初始值,
itertools.count调整start参数即可。 - 原列表中的元素值不影响编号分配,因为我们仅依据元素的遍历位置生成编号。
内容的提问来源于stack exchange,提问作者chrislmonster
相关产品推荐
相关产品推荐

