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

在ArcGIS Pro中用Python列表实现分组生成唯一ID并替换9999空值

分组生成唯一ID并替换9999空值(纯Python实现)

需求说明

  • 需将列表中标记为9999的ID替换为对应分组的下一个可用ID
  • 分组依据:南北标识(NS)、东西标识(EW)、地块编号(Section) 三个字段的组合(对应最终ID的前8位)
  • 最终ID为长整型,其余字段统一处理为固定长度字符串
  • 限制:不能使用Pandas,需纯Python列表实现以适配ArcGIS Pro

实现思路

用字典维护分组计数器:

  • 第一步:遍历所有有效ID(非9999),提取分组标识,记录每个分组已使用的最大序号
  • 第二步:再次遍历所有条目,对9999的条目,根据分组标识获取下一个可用序号,生成新ID并更新计数器

完整代码示例

# 原始数据(将数字统一转为字符串,避免前导零丢失)
list_NS = ['105', '106', '103', '002', '104', '001', '105', '106', '103', '002', '104', '001', '105']
list_EW = ['101', '106', '104', '003', '005', '109', '101', '106', '104', '003', '005', '109', '101']
list_sec = ['18', '12', '08', '14', '07', '02', '18', '12', '08', '14', '07', '02', '18']
list_id = [1051011801, 1061061201, 1031040801, 20031401, 1041050701, 11090201, 9999, 9999, 9999, 9999, 9999, 9999, 9999]

# 1. 初始化分组计数器字典,键为(NS, EW, Sec)组合,值为当前最大序号
group_counter = {}

# 先遍历所有有效ID,统计每个分组的最大序号
for ns, ew, sec, current_id in zip(list_NS, list_EW, list_sec, list_id):
    if current_id != 9999:
        # 将ID转为10位字符串,补零处理格式异常
        id_str = str(current_id).zfill(10)
        # 用NS/EW/Sec的元组作为分组键,比从ID提取更可靠
        group_key = (ns, ew, sec)
        # 提取当前ID的末尾两位序号
        current_seq = int(id_str[-2:])
        # 更新计数器:保留当前分组的最大序号
        if group_key in group_counter:
            if current_seq > group_counter[group_key]:
                group_counter[group_key] = current_seq
        else:
            group_counter[group_key] = current_seq

# 2. 遍历所有条目,替换9999为新ID
updated_ids = []
for ns, ew, sec, current_id in zip(list_NS, list_EW, list_sec, list_id):
    if current_id == 9999:
        group_key = (ns, ew, sec)
        # 获取下一个序号:分组不存在则从1开始,否则取现有最大序号+1
        next_seq = group_counter.get(group_key, 0) + 1
        # 生成前8位分组前缀(NS(3)+EW(3)+Sec(2))
        group_prefix = f"{ns}{ew}{sec}"
        # 生成10位完整ID字符串,末尾两位补零对齐
        new_id_str = f"{group_prefix}{str(next_seq).zfill(2)}"
        # 转成长整型后加入结果列表
        new_id = int(new_id_str)
        updated_ids.append(new_id)
        # 更新计数器,确保后续同分组条目序号连续
        group_counter[group_key] = next_seq
    else:
        # 非9999的ID直接保留
        updated_ids.append(current_id)

# 输出更新后的ID列表
print("更新后的ID列表:")
print(updated_ids)

代码说明

  • 分组键设计:直接使用(NS, EW, Sec)元组作为字典键,避免从ID字符串提取可能出现的格式错误
  • 前导零处理:所有字段统一转为固定长度字符串,保证分组标识的一致性
  • 计数器逻辑:先统计已有ID的最大序号,再为新条目分配下一个序号,确保序号连续不重复
  • ArcGIS适配:纯Python原生语法实现,无第三方依赖,可直接集成到ArcGIS Pro的Python工具脚本中

内容的提问来源于stack exchange,提问作者jimbybob1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:06:13