You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于字符串公共部分匹配合并两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:57:03