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

如何根据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)

逻辑说明:

  1. 把data["a"]的键值对转为列表,通过lambda指定按条目的Passwd值排序
  2. 用groupby按Passwd分组,第一个参数是排序后的列表,第二个参数为分组键的提取规则
  3. 遍历每个分组,将组内所有键提取为列表后存入结果字典

内容的提问来源于stack exchange,提问作者Gamsner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:10:39