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

Python:如何基于共享子串模式创建分组字典

问题:将含相同子串的列表元素归类到字典中

我希望将列表中包含相同子串(motif)的元素归到同一个字典键下,键为该motif,值为包含该motif的元素列表。

给定列表:

list_key = ['I2a1a2a1a2', 'I2a1a2a', 'I2a1b2a', 'I2a1a2', 'I2a1b1a1a1b1a']

例如,I2a1a2是I2a1a2a和I2a1a2a1a2的子串,期望输出字典:

dic_branches = {'I2a1a2':['I2a1a2','I2a1a2a','I2a1a2a1a2'],'I2a1b1a1a1b1a':['I2a1b1a1a1b1a'],'I2a1b2a':['I2a1b2a']}

我编写的代码如下:

for i in range(len(list_key)):
    for j in range(i+1,len(list_key)):
        diff_length = abs(len(list_key[i])-len(list_key[j]))
        if list_key[i] == list_key[j][:-diff_length]:
            print (list_key[i],list_key[j])
        else:
            print (list_key[j])

该代码能定位到目标元素,但存在重复输出,寻求正确实现预期输出的方法。


解决方案

核心思路是先按字符串长度排序,优先处理短的motif,避免长串误占分类;同时用集合记录已处理元素,防止重复归类。实现代码如下:

list_key = ['I2a1a2a1a2', 'I2a1a2a', 'I2a1b2a', 'I2a1a2', 'I2a1b1a1a1b1a']
dic_branches = {}
processed = set()

# 按字符串长度升序排序,确保短motif先被处理
sorted_keys = sorted(list_key, key=lambda x: len(x))

for motif in sorted_keys:
    if motif in processed:
        continue
    # 收集所有以当前motif开头的元素
    group = [key for key in list_key if key.startswith(motif)]
    dic_branches[motif] = group
    # 标记这些元素为已处理,避免重复归类
    processed.update(group)

print(dic_branches)

代码说明

  1. 排序处理:将列表按字符串长度从小到大排序,保证短的motif优先被匹配,避免长字符串被误当作独立motif。
  2. 去重机制:processed集合记录已经被归类的元素,跳过已处理的motif,防止重复输出。
  3. 匹配逻辑:用str.startswith()直接判断字符串是否以目标motif开头,比手动截取字符串更简洁准确。

运行结果

{'I2a1a2': ['I2a1a2a1a2', 'I2a1a2a', 'I2a1a2'], 'I2a1b2a': ['I2a1b2a'], 'I2a1b1a1a1b1a': ['I2a1b1a1a1b1a']}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:47:27