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)
代码说明
- 排序处理:将列表按字符串长度从小到大排序,保证短的motif优先被匹配,避免长字符串被误当作独立motif。
- 去重机制:
processed集合记录已经被归类的元素,跳过已处理的motif,防止重复输出。 - 匹配逻辑:用
str.startswith()直接判断字符串是否以目标motif开头,比手动截取字符串更简洁准确。
运行结果
{'I2a1a2': ['I2a1a2a1a2', 'I2a1a2a', 'I2a1a2'], 'I2a1b2a': ['I2a1b2a'], 'I2a1b1a1a1b1a': ['I2a1b1a1a1b1a']}
内容的提问来源于stack exchange,提问作者Pierre
相关产品推荐
相关产品推荐

