Python如何对文件内键值对按key过滤分组得到指定嵌套结构
按用户名分组关联项目实现方案
需求描述
现有文本文件每行格式为用户名 : 项目名,样例数据如下:
a.ganesh : sp-tns-ops-dashboard a.ganesh : tns-extern a.shahnawaz : pricing-dm-rest a.shubhamkumar : apl aadhar.sachdeva : athena aakash.j : cms-cs-gateway aakash.j : cms-enrichment-console aakash.j : sp-slm-sps-external aakash.j : preprod-cms-localisation-gateway
需要按用户名做分组,将同一用户名下的所有项目归集为列表,最终得到分组后的嵌套结构。
原有代码问题
你当前写的代码存在几个逻辑漏洞,无法实现分组效果:
- 字符串拆分后没有清理前后空格:直接用
:拆分后,用户名、项目名两侧会残留多余空格,会导致后续用户名匹配判断失效 - 没有维护分组对应的项目容器:仅判断用户名是否存在于结果列表,没有给每个用户名单独维护项目列表,无法归集同一用户的多个项目
- 存储结构不符合要求:直接拼接字符串无法生成需要的嵌套列表结构
正确实现代码
分组类场景用字典做映射存储效率最高,遍历每行数据时自动给对应用户追加项目,最后转换为需要的嵌套结构即可,代码如下:
from collections import defaultdict def test(): # 初始化分组映射:key为用户名,value为该用户关联的项目列表 user_group = defaultdict(list) # 用with语句打开文件更安全,会自动释放文件句柄 with open("sorted_list.txt", "r", encoding="utf-8") as f: for line in f: line = line.strip() # 跳过空行 if not line: continue # 按分隔符拆分,同时清理两侧空格 username, project = [part.strip() for part in line.split(" : ")] user_group[username].append(project) # 转换为目标嵌套结构 result = [] for user, projects in user_group.items(): result.append({user: projects}) print(result) test()
注:你给出的期望输出样例里
[a.ganesh: ["sp-tns-ops-dashboard", "tns-extern"]]不是合法Python语法,上述代码用单键字典存储每组的用户-项目映射,分组逻辑和你预期完全一致。如果需要输出和样例完全一样的字符串格式,可以在最后遍历结果自行拼接字符串。如果不想导入
defaultdict,也可以用普通字典实现:判断用户名不在字典中时,先给该key初始化空列表,再追加项目即可。
运行效果
代码执行后会自动完成去重、分组,每个用户对应的所有项目都会归集到同一个列表下,不会出现数据遗漏、重复分组的问题。
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

