如何重新编号多边形ID,消除序号间隙实现从1开始连续排列?
问题:跳过红色多边形后,如何让输出的多边形ID从1开始连续编号
我程序中的关键代码如下:
polygons = {} removed = 0 with open("Polygon.csv") as csvfile: reader = csv.reader(csvfile) for row in reader: if row[5] == "Color Hex": pass else: if checkred(row[5]) == True: removed += 1 isremoved = True continue else: isremoved = False is_triangle = row[0] == "Polygon" if row[0] == "Rectangle" or is_triangle: poly_id = int(row[1]) # 原代码中此处应为将多边形数据存入polygons字典的逻辑 polygons[poly_id] = { "verts": ..., # 对应顶点数据 "color": ... # 对应颜色数据 }
其中checkred()函数用于判断十六进制颜色值是否为红色,返回布尔值。当该函数返回True时,我会跳过当前循环剩余代码,导致输出的多边形字典中poly_id存在序号间隙(比如出现[2]、[3]、[13]、[18]这类不连续的ID)。
请问如何重新处理,使输出的ID从1开始连续编号,不受循环跳过的影响?
解决方案1:循环内用独立计数器直接生成连续ID
直接在循环外初始化一个计数器,每成功添加一个非红色多边形,就把计数器加1,用这个计数器作为新的poly_id,替代CSV里的原ID:
polygons = {} removed = 0 current_id = 1 # 从1开始的连续ID计数器 with open("Polygon.csv") as csvfile: reader = csv.reader(csvfile) for row in reader: # 跳过表头行 if row[5] == "Color Hex": continue # 是红色就跳过,不处理 if checkred(row[5]): removed += 1 continue # 处理矩形或多边形 if row[0] in ("Rectangle", "Polygon"): # 用current_id作为新ID存入字典 polygons[current_id] = { "verts": ..., # 填入实际顶点数据 "color": ... # 填入实际颜色数据 } current_id += 1 # 计数器自增,准备下一个ID
这种方法一次循环就能搞定,不用额外后续操作,效率最高。
解决方案2:先收集数据再重新映射ID
如果需要保留原ID和新ID的对应关系,或者不想改动原循环逻辑,可以先按原逻辑收集带间隙的数据,之后再生成连续ID的新字典:
# 原逻辑不变,先收集带间隙的多边形数据 polygons = {} removed = 0 with open("Polygon.csv") as csvfile: reader = csv.reader(csvfile) for row in reader: if row[5] == "Color Hex": pass else: if checkred(row[5]) == True: removed += 1 isremoved = True continue else: isremoved = False is_triangle = row[0] == "Polygon" if row[0] == "Rectangle" or is_triangle: poly_id = int(row[1]) polygons[poly_id] = { "verts": ..., "color": ... } # 重新生成连续ID的字典 continuous_polygons = {} # enumerate从1开始计数,遍历原字典的所有值 for new_id, poly_data in enumerate(polygons.values(), start=1): continuous_polygons[new_id] = poly_data # 后续业务逻辑使用continuous_polygons即可
这种方法适合需要追溯原数据ID的场景,比如后续要对应回CSV里的原始条目时。
内容的提问来源于stack exchange,提问作者Coll y
相关产品推荐
相关产品推荐

