Python 列表匹配:基于连续点高程误差的匹配算法
本文介绍了一种 Python 列表匹配算法,用于匹配两组包含点名和高程信息的列表。两组列表 list1 和 list2 中的每个元素都是一个字典,包含 'name' (点名) 和 'height' (高程) 两个属性。算法要求满足以下条件才能认为匹配成功:
- 连续
N个点及以上的高程误差在一定范围内。 - 连续
N个点的点名也相同。
在匹配过程中,算法会先进行正序匹配,如果存在未匹配的点,则会进行倒序匹配。如果仍存在未匹配的点,算法会进行高程匹配,即只匹配高程误差,不考虑点名。当匹配结束时,如果仍然存在未匹配的点,则会将 N 减 1,并再次进行匹配。
以下是代码实现:
def match_points(list1, list2, n, error_range):
matched = [] # 用于记录已匹配的索引
for i in range(len(list1)):
if i in matched: # 跳过已匹配的点
continue
match_count = 1 # 匹配的点数
for j in range(i + 1, len(list1)):
if j in matched: # 跳过已匹配的点
continue
if list1[i]['name'] == list1[j]['name'] and abs(list1[i]['height'] - list1[j]['height']) <= error_range and \
list2[i]['name'] == list2[j]['name'] and abs(list2[i]['height'] - list2[j]['height']) <= error_range:
match_count += 1
else:
break
if match_count >= n:
for k in range(i, j + 1):
matched.append(k) # 标记已匹配的点
break
if len(matched) == len(list1): # 所有点都匹配成功
return True
# 倒序匹配一次
for i in range(len(list1) - 1, -1, -1):
if i in matched: # 跳过已匹配的点
continue
match_count = 1 # 匹配的点数
for j in range(i - 1, -1, -1):
if j in matched: # 跳过已匹配的点
continue
if list1[i]['name'] == list1[j]['name'] and abs(list1[i]['height'] - list1[j]['height']) <= error_range and \
list2[i]['name'] == list2[j]['name'] and abs(list2[i]['height'] - list2[j]['height']) <= error_range:
match_count += 1
else:
break
if match_count >= n:
for k in range(j, i + 1):
matched.append(k) # 标记已匹配的点
break
if len(matched) == len(list1): # 所有点都匹配成功
return True
# 重新匹配,只匹配高程
n -= 1
while n > 1:
matched = []
for i in range(len(list1)):
if i in matched: # 跳过已匹配的点
continue
match_count = 1 # 匹配的点数
for j in range(i + 1, len(list1)):
if j in matched: # 跳过已匹配的点
continue
if abs(list1[i]['height'] - list1[j]['height']) <= error_range and \
abs(list2[i]['height'] - list2[j]['height']) <= error_range:
match_count += 1
else:
break
if match_count >= n:
for k in range(i, j + 1):
matched.append(k) # 标记已匹配的点
break
if len(matched) == len(list1): # 所有点都匹配成功
return True
n -= 1
return False # 未匹配成功
其中,参数 n 表示需要匹配的最小连续点数,error_range 表示允许的误差范围。函数返回 True 表示所有点都匹配成功,返回 False 表示存在未匹配成功的点。
原文地址: https://www.cveoy.top/t/topic/oYv7 著作权归作者所有。请勿转载和采集!