Python实现列表中元组形式地址的属性匹配对比方法问询
符合Python风格的地址匹配实现方法
首先得说,你原来的嵌套循环加重复条件判断的写法确实不够Pythonic,不仅冗余,还没完全覆盖需求(比如多值属性的匹配、只对比共有属性这些点都没处理好)。咱们换一种更清晰、高效的方式来实现:
核心思路
- 先把两个地址列表转换成按属性类型分组的字典,每个属性类型对应的值用集合存储——集合的好处是能快速判断两个集合有没有交集,完美适配多值属性的匹配需求。
- 只对比两个地址共有的属性类型,忽略各自独有的属性。
- 区分多值属性(比如
AddressNumber、PlaceName)和单值属性:- 多值属性:只要两个集合有交集(任意一个值匹配)就算该属性匹配
- 单值属性:需要值完全一致(比如
StateName、ZipCode)
完整实现代码
address1 = [('1546-1711', 'AddressNumber'), ('South', 'StreetNamePreDirectional'), ('4650', 'AddressNumber'), ('West,', 'StreetNamePostDirectional'), ('Green', 'PlaceName'), ('Lake', 'PlaceName'), ('town,', 'PlaceName'), ('MI', 'StateName'), ('84107', 'ZipCode')] address2 = [('800', 'AddressNumber'), ('Green', 'StreetName'), ('Lake', 'PlaceName'), ('town,', 'PlaceName'), ('MI', 'StateName'), ('84110', 'ZipCode')] # 辅助函数:把地址列表转成{属性类型: 值集合}的字典 def address_to_dict(address_list): addr_dict = {} for value, attr_type in address_list: # 先清理值里的逗号,避免标点导致的匹配失败 cleaned_value = value.strip(',') if attr_type not in addr_dict: addr_dict[attr_type] = set() addr_dict[attr_type].add(cleaned_value) return addr_dict # 转换两个地址为字典格式 addr1_dict = address_to_dict(address1) addr2_dict = address_to_dict(address2) # 定义需要多值匹配的属性类型(可根据需求调整) multi_value_attrs = {'AddressNumber', 'PlaceName'} # 核心匹配函数 def is_address_match(addr1_dict, addr2_dict): # 获取两个地址共有的属性类型 common_attrs = addr1_dict.keys() & addr2_dict.keys() # 如果没有共有属性,直接返回不匹配 if not common_attrs: return False for attr_type in common_attrs: vals1 = addr1_dict[attr_type] vals2 = addr2_dict[attr_type] if attr_type in multi_value_attrs: # 多值属性:只要有一个值匹配(集合有交集) if not vals1 & vals2: return False else: # 单值属性:要求值完全一致 if vals1 != vals2: return False # 所有共有属性都匹配,返回True return True # 测试匹配结果 print(is_address_match(addr1_dict, addr2_dict)) # 输出:True
代码优势
- 更清晰的逻辑:用字典分组后,直接按属性类型处理,避免了嵌套循环的混乱
- 高效的匹配:集合的交集判断是O(1)级别的,比遍历所有值快很多
- 可扩展性强:如果需要新增多值属性,只需要往
multi_value_attrs集合里加就行 - 鲁棒性更好:提前清理了值里的标点,避免类似
town,和town这种不必要的不匹配
内容的提问来源于stack exchange,提问作者min2bro
相关产品推荐
相关产品推荐

