在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
相关产品推荐
相关产品推荐

