如何根据Passwd值对Python字典中的元素进行分组?
按Passwd值分组字典键的解决方案
问题背景
给定如下数据:
data = { "a":{ "00066554466":{ "Id":650, "Passwd":"e1c2a06545de9164d7e87cd98bed57c5", "zone":"Europe/Zurich" }, "8745212300":{ "Id":400, "Passwd":"ecb95502daace7f46bf12b484d086e5b", "zone":"Europe/Zurich" }, "8745212301":{ "Id":401, "Passwd":"ecb95502daace7f46bf12b484d086e5b", "zone":"Europe/Zurich" }, "8745212302":{ "DevId":402, "Passwd":"ecb95502daace7f46bf12b484d086e5b", "zone":"Europe/Zurich" } } }
需要将data["a"]中的键(如"00066554466")按照对应的Passwd值分组,得到如下预期结果:
{ "e1c2a06545de9164d7e87cd98bed57c5":[ "00066554466" ], "ecb95502daace7f46bf12b484d086e5b":[ "8745212300", "8745212301", "8745212302" ] }
解决方案
方法一:普通字典循环(简单高效)
这种方法无需额外依赖,逻辑直观且不易出错:
result = {} inner_data = data["a"] for key, value in inner_data.items(): passwd = value["Passwd"] if passwd not in result: result[passwd] = [] result[passwd].append(key) print(result)
逻辑说明:
- 初始化空字典
result存储分组结果 - 遍历
data["a"]的每一组键值对 - 提取当前条目的
Passwd值作为分组键 - 若该Passwd未在结果字典中,先创建对应空列表
- 将当前键添加到对应Passwd的列表中
方法二:使用itertools.groupby(需注意排序前提)
你之前用groupby失败的核心原因是未先按Passwd对条目排序——groupby仅对连续相同的元素分组,必须先排序才能实现全局分组:
from itertools import groupby inner_data = data["a"] # 将条目转为列表,并按Passwd值排序 sorted_items = sorted(inner_data.items(), key=lambda x: x[1]["Passwd"]) result = {} for passwd, group in groupby(sorted_items, key=lambda x: x[1]["Passwd"]): # 提取分组内的所有键 result[passwd] = [item[0] for item in group] print(result)
逻辑说明:
- 把
data["a"]的键值对转为列表,通过lambda指定按条目的Passwd值排序 - 用
groupby按Passwd分组,第一个参数是排序后的列表,第二个参数为分组键的提取规则 - 遍历每个分组,将组内所有键提取为列表后存入结果字典
内容的提问来源于stack exchange,提问作者Gamsner
相关产品推荐
相关产品推荐

