You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重新编号多边形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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:10:24