如何匹配子串对并生成大唯一字符串与子串的映射字典?
问题描述
我有一个包含约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 }
代码说明
- 集合优化:将子串列表转为集合
sub_set,避免每次遍历子串列表查找,提升效率。 - 字典推导逻辑:
- 外层遍历大列表中的每个字符串
s - 遍历每个子串
s1,先判断s1长度不超过s(避免索引越界) - 计算
s2 = s[len(s1):],即s去掉s1前缀后的剩余部分 - 如果
s2存在于sub_set中,说明s1 + s2 = s,符合要求,将s作为键、s1/s2作为值存入字典
- 外层遍历大列表中的每个字符串
- 处理重复子串:对于
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
相关产品推荐
相关产品推荐

