Python列表按前缀与中间段动态分组问题求助
问题描述
给定一个列表:
list = ['aaazzz0', 'aaazzz1', 'aaazzz2', 'aaazzz3', 'aaazzz4', 'aaazzz5', 'bbbzzz0', 'bbbzzz0', 'bbbzzz1','bbbzzz2','bbbzzz3','bbbzzz4','bbbxxx0','bbbxxx1','bbbxxx2','bbbxxx3']
期望将其转换为如下嵌套字典结构,需根据列表元素的第4-6位字符动态生成zzz、xxx这类二级键:
{ "aaa": { "zzz": [ "aaazzz0", "aaazzz1", "aaazzz2", "aaazzz3", "aaazzz4", "aaazzz5" ] }, "bbb": { "zzz": [ "bbbzzz0", "bbbzzz1", "bbbzzz2", "bbbzzz3", "bbbzzz4" ], "xxx": [ "bbbxxx0", "bbbxxx1", "bbbxxx2", "bbbxxx3" ] } }
当前编写的代码无法得到预期结果,代码如下:
import re, json list = ['aaazzz0', 'aaazzz1', 'aaazzz2', 'aaazzz3', 'aaazzz4', 'aaazzz5', 'bbbzzz0', 'bbbzzz0', 'bbbzzz1','bbbzzz2','bbbzzz3','bbbzzz4','bbbxxx0','bbbxxx1','bbbxxx2','bbbxxx3'] regex = '^.{3}([a-z]{3})' all_dict = {} a = {} a_list = [] b = {} b_list = [] for item in list: end_match = re.findall(regex, item)[0] aaa_match = re.search('aaa', item) bbb_match = re.search('bbb', item) for suffix in end_match: if aaa_match: a[suffix] = [] a_list.append(item) a[suffix] = a_list elif bbb_match: b[suffix] = [] b_list.append(item) b[suffix] = b_list all_dict["aaa"] = a all_dict["bbb"] = b print(json.dumps(all_dict,indent=4))
修正后的代码及说明
原代码存在硬编码前缀判断、重复处理元素、全局列表导致数据混乱等问题,以下是修正后的实现:
import json input_list = ['aaazzz0', 'aaazzz1', 'aaazzz2', 'aaazzz3', 'aaazzz4', 'aaazzz5', 'bbbzzz0', 'bbbzzz0', 'bbbzzz1','bbbzzz2','bbbzzz3','bbbzzz4','bbbxxx0','bbbxxx1','bbbxxx2','bbbxxx3'] result = {} for item in input_list: # 直接通过切片提取前缀(前3位)和中间段(第4-6位) prefix = item[:3] middle = item[3:6] # 动态初始化一级键对应的字典 if prefix not in result: result[prefix] = {} # 动态初始化二级键对应的列表 if middle not in result[prefix]: result[prefix][middle] = [] # 避免添加重复元素 if item not in result[prefix][middle]: result[prefix][middle].append(item) # 格式化输出结果 print(json.dumps(result, indent=4))
关键改进点:
- 动态提取键:用字符串切片替代正则,直接获取前缀和中间段,格式固定时效率更高且更直观
- 无硬编码结构:无需提前定义
aaa、bbb相关变量,自动适配任意符合格式的前缀和中间段 - 解决重复元素问题:添加元素前判断是否已存在,避免结果中出现重复项
- 结构动态构建:逐层检查字典键是否存在,不存在则初始化对应结构,逻辑清晰且扩展性强
内容的提问来源于stack exchange,提问作者user14558198
相关产品推荐
相关产品推荐

