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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:45:29