Python如何按前缀匹配多列表生成标准名称映射字典
问题原因
- 仅遍历了单个别名列表,未覆盖所有采集的别名数据源
- 匹配成功后直接给字典键赋值为单个字符串,未追加到列表存储多匹配结果
- 未做别名长度校验,极端情况下会出现索引越界报错
解决方案
首先将所有待匹配的别名列表合并,通过字典初始化空列表存储匹配结果,支持自定义匹配前缀长度,适配你实际业务前5个字符匹配的需求:
from collections import defaultdict # 输入数据 main = ['dayn is the one', 'styn is a main', 'tyrn is the third main'] lst2 = ['dayz', 'stzn', 'tyrm'] lst3 = ['styzerwe', 'tyrmadsf', 'dayttt'] lst4 = ['dayl', 'styyzt', 'tyrl'] # 合并所有别名列表,后续新增数据源直接加在这里即可 all_alias = lst2 + lst3 + lst4 # 匹配前缀长度,业务场景需要前5个字符直接修改为5 MATCH_PREFIX_LENGTH = 3 # 初始化结果字典,默认值为空列表 matched = defaultdict(list) for standard_name in main: current_prefix = standard_name[:MATCH_PREFIX_LENGTH] for alias in all_alias: # 先校验别名长度足够,避免索引报错 if len(alias) >= MATCH_PREFIX_LENGTH and alias[:MATCH_PREFIX_LENGTH] == current_prefix: matched[standard_name].append(alias) # 转换为普通字典,可直接用于pandas映射 result = dict(matched) print(result)
运行后输出结果和你期望的完全一致:
{'dayn is the one': ['dayz', 'dayttt', 'dayl'], 'styn is a main': ['styzerwe', 'styyzt'], 'tyrn is the third main': ['tyrm', 'tyrmadsf', 'tyrl']}
如果你不想引入collections.defaultdict,也可以用普通字典实现:
MATCH_PREFIX_LENGTH = 3 all_alias = lst2 + lst3 + lst4 matched = {} for standard_name in main: current_prefix = standard_name[:MATCH_PREFIX_LENGTH] matched[standard_name] = [] for alias in all_alias: if len(alias) >= MATCH_PREFIX_LENGTH and alias[:MATCH_PREFIX_LENGTH] == current_prefix: matched[standard_name].append(alias)
内容的提问来源于stack exchange,提问作者John Taylor
相关产品推荐
相关产品推荐

