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

如何匹配子串对并生成大唯一字符串与子串的映射字典?

问题描述

我有一个包含约1000个唯一字符串的大列表,示例:['bbbhbbbh', 'jjjhhssa', 'eeeffus', ...];还有一个约50个子串的小列表,大列表中的每个字符串都由小列表里的两个子串(可重复)拼接而成,小列表示例:['bbbh', 'jjjh', 'hssa', 'eeef', 'fus', ...]。

我需要编写一个函数,接收大字符串列表作为参数,返回一个字典:键是大列表中的字符串,值是对应的两个子串(用/分隔),示例输出:

result = {
    'bbbhbbbh': 'bbbh/bbbh', 
    'jjjhhssa': 'jjjh/hssa', 
    'eeeffus': 'eeef/fus',
    ...
}

我尝试过用嵌套for循环实现,但无法正确处理重复子串的情况(比如bbbhbbbh只找到一个bbbh),当前代码及输出如下:

result = []    

for string in pair_list:
    matches = []
    for substring in sub_list:
        if substring in string:
            matches.append(substring)
    if matches:
        result.append(matches)

print(result)
# 输出:[['bbbh'], ['jjjh', 'hssa'], ['eeef', 'fus'], ...]

希望能得到更简洁的实现(比如列表/字典推导),且仅使用内置模块和json包(不导入其他第三方包)。


解决方案

核心思路

原代码的问题是仅查找包含在原字符串中的子串,但没有验证子串是否是拼接成原字符串的前后两部分。我们需要基于「子串拼接等于原字符串」的逻辑来实现,同时利用集合提升子串查找效率。

简洁实现(字典推导)

def get_substring_map(pair_list, sub_list):
    sub_set = set(sub_list)  # 转集合实现O(1)快速查找
    return {
        s: f"{s1}/{s[len(s1):]}"
        for s in pair_list
        for s1 in sub_list
        if len(s1) <= len(s) and s[len(s1):] in sub_set
    }

代码说明

  1. 集合优化:将子串列表转为集合sub_set,避免每次遍历子串列表查找,提升效率。
  2. 字典推导逻辑:
    • 外层遍历大列表中的每个字符串s
    • 遍历每个子串s1,先判断s1长度不超过s(避免索引越界)
    • 计算s2 = s[len(s1):],即s去掉s1前缀后的剩余部分
    • 如果s2存在于sub_set中,说明s1 + s2 = s,符合要求,将s作为键、s1/s2作为值存入字典
  3. 处理重复子串:对于bbbhbbbh,当s1取bbbh时,s2计算结果也是bbbh,且存在于子串集合中,因此会生成bbbh/bbbh的正确值。

测试示例

pair_list = ['bbbhbbbh', 'jjjhhssa', 'eeeffus']
sub_list = ['bbbh', 'jjjh', 'hssa', 'eeef', 'fus']
print(get_substring_map(pair_list, sub_list))
# 输出:
# {'bbbhbbbh': 'bbbh/bbbh', 'jjjhhssa': 'jjjh/hssa', 'eeeffus': 'eeef/fus'}

内容的提问来源于stack exchange,提问作者kenai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:05:23