使用 arcpy 和字典删除基于层次结构的重复记录

问题描述

我正在尝试使用带有 arcpy 更新游标的数据字典来标记重复记录并删除它们,但我遇到了字典问题。

本质上,我的代码遍历属性表并为每个新的 FACE_ID 添加一个 FACE_ID:CHNG_TYPE 的字典条目。如果它遇到字典中已经存在的 FACE_ID,它会比较重复的 FACE_ID 的 CHNG_TYPE 以查看应该删除哪个(我已经忽略了加权比较,因为这不是问题)。

为了比较它们,游标直接从它所在的游标行中拉取第一个更改 (change_a) CHNG_TYPE。它还拉取 FACE_ID,以便它可以查询字典以获取一个 FACE_ID 的 CHNG_TYPE。

当我打印字典时,它看起来像我期望的那样。但是,change_b = dict[row[0]] 每次都计算为相同的值,我不知道为什么。

当我使用此代码创建字典但省略 elif 语句时,我可以使用 dict[FACE_ID] 准确地提取 change_b 值。

下面的代码,任何帮助表示赞赏!

with arcpy.da.UpdateCursor(fc,['FACE_ID','CHNG_TYPE','RELATE']) as cursor:
        dict = {}
        for row in cursor:
                if row[0] in dict:
                        change_a = row[1]
                        change_b = dict[row[0]]
                        print(change_a + ' ' + change_b)
                elif row[0] not in dict:
                        dict[row[0]] = row[1]

举个例子,这个语句创建字典并返回期望值:

with arcpy.da.UpdateCursor(fc,'RELATE']) as cursor:
        dict = {}
        for row in cursor:
                if row[0] not in dict:
                        dict[row[0]] = row[1]
dict[123456]

解决方法

您是否考虑过使用 ArcGIS Pro 中的删除相同功能或查找相同功能?

arcpy.management.DeleteIdentical(in_dataset,fields,{xy_tolerance},{z_tolerance})

arcpy.management.FindIdentical(in_dataset,out_dataset,{z_tolerance},{output_record_option})

这可能是比您的方式更快、更具成本效益的解决方案。