如何基于字符串公共部分匹配合并两个Python列表得到指定结果
两个字符串列表按公共核心匹配合并的实现方案
实现思路
我们可以通过字符串相似度匹配的逻辑完成分组合并,核心步骤如下:
- 以list1的元素顺序作为分组的锚点顺序,保证最终输出顺序和示例一致
- 为每个待匹配的字符串计算与已有分组核心字符串的相似度,高于设定阈值就归入对应分组
- 所有元素分配完成后,按分组顺序展开所有元素即可得到目标结果
代码实现
方案1:使用模糊匹配库(推荐,适配拼写错误场景)
首先需要安装依赖库:
pip install fuzzywuzzy python-Levenshtein
然后实现代码:
from fuzzywuzzy import fuzz list1 = ["Equipment ONLY - Bees Technologies", "Bees Technologies", "Chris Metal SA - Central Office", "NSA Aerospace tech"] list2 = ["Bees Tech, Inc.", "Chris Metal, SA", "NSA Arerospace"] # 初始化分组:以list1元素为初始锚点,相同核心的先归为一组 groups = [] # 先处理list1的分组 for s in list1: found = False for i in range(len(groups)): # 计算和分组第一个元素的相似度 if fuzz.partial_ratio(s, groups[i][0]) > 70: groups[i].append(s) found = True break if not found: groups.append([s]) # 再把list2的元素分到对应组 for s in list2: max_score = 0 target_group_idx = 0 for i in range(len(groups)): score = fuzz.partial_ratio(s, groups[i][0]) if score > max_score: max_score = score target_group_idx = i if max_score > 70: groups[target_group_idx].append(s) # 展开分组得到最终结果 final_list = [item for group in groups for item in group] print(final_list)
运行后输出的结果和要求的目标列表完全一致。
方案2:无第三方依赖的公共子串匹配实现
如果不想安装额外库,可以通过判断最长公共子串占比来实现匹配:
def get_common_substr_ratio(a, b): # 计算两个字符串的最长公共子串长度占较短字符串的比例 m, n = len(a), len(b) dp = [[0]*(n+1) for _ in range(m+1)] max_len = 0 for i in range(1, m+1): for j in range(1, n+1): if a[i-1].lower() == b[j-1].lower(): dp[i][j] = dp[i-1][j-1] + 1 max_len = max(max_len, dp[i][j]) return max_len / min(m, n) list1 = ["Equipment ONLY - Bees Technologies", "Bees Technologies", "Chris Metal SA - Central Office", "NSA Aerospace tech"] list2 = ["Bees Tech, Inc.", "Chris Metal, SA", "NSA Arerospace"] groups = [] # 处理list1分组 for s in list1: found = False for i in range(len(groups)): if get_common_substr_ratio(s, groups[i][0]) > 0.4: groups[i].append(s) found = True break if not found: groups.append([s]) # 处理list2分组 for s in list2: max_ratio = 0 target_idx = 0 for i in range(len(groups)): ratio = get_common_substr_ratio(s, groups[i][0]) if ratio > max_ratio: max_ratio = ratio target_idx = i if max_ratio > 0.4: groups[target_idx].append(s) final_list = [item for group in groups for item in group] print(final_list)
参数调整说明
如果后续匹配出现误差,可以调整两个阈值:
- 模糊匹配方案的相似度阈值(默认70),数值越高匹配越严格
- 公共子串方案的占比阈值(默认0.4),数值越高匹配越严格
内容的提问来源于stack exchange,提问作者bayramco
相关产品推荐
相关产品推荐

