最近多次需要取得要素类中某字段的唯一值,在 arcgis 中的 python 窗口写着也很简单.但每次写,略显麻烦,就想着封装成函数吧.
动起手来,发现为了普适,还是比平时单写复杂些的,不仅可以取得某一字段的唯一值,亦可取得某几个字段联合后的唯一值,代码如下:
# coding:utf-8
import arcpy
def distinct_value(shp, *field):
"""打印出某一个字段的唯一值,或某几个字段联合后的唯一值.
参数 shp 可以为 shp 数据,可以为地理数据库要素类
参数 field ,如果只有 1 个可以直接写,如果 1 个以上,需要使用括号括起来,不然报错
变量 val_union 为要素类中该行中,所需要的所有字段的联合值
变量 index 为该行中,某一个字段的索引
变量 field_value 为该行中,某一个字段的值
"""
distinct = set()
with arcpy.da.SearchCursor(shp, *field) as cursor:
for row in cursor:
val_union = ''
index = len(row) - 1 # 该行最大索引
while index >= 0:
# for i, k in enumerate(row):#报错,貌似在 with ... cursor 下使用 for 循环有问题
field_value = row[index] # 该行某字段下的某索引下的字段值
# if field_value is not None and field_value != '':# 剔除字段值为 None 或空字符串
if field_value == '' or field_value is None: # 短路剔除,效果更好
pass
else:
if isinstance(field_value, (int, float)):
field_value = str(field_value)
val_union = field_value + val_union
distinct.add(val_union)
index = index - 1 # 索引逐降
print("返回唯一值 {} 条".format(len(distinct)))
for val in distinct: # 直接打印结果,如需进一步操作,可使用 return 的返回值
print(val)
return distinct
if __name__ == '__main__':
shp = r"E:\测试.gdb\test"
distinct_value(shp, ("mc", "objectid"))
需要注意的是: