根据指定的字典值对字典元素进行分组

Gam*_*ner 1 python dictionary

我有这个数据:

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"
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

我想用相同的密码对密钥进行分组。所以结果应该如下所示。

{
   "e1c2a06545de9164d7e87cd98bed57c5":[
      "00066554466"
   ],
   "ecb95502daace7f46bf12b484d086e5b":[
      "8745212300",
      "8745212301",
      "8745212302"
   ]
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用 itertools.groupby 和 with for k,v in xxx,但结果从来都不是我需要的。

moz*_*way 6

itertools.groupby当数据已经按连续顺序分组的值进行排序时,效果很好,但您的数据可能并不总是这样。

而是使用dict.setdefault嵌套循环:

out = {}

for d1 in data.values():
    for k, d2 in d1.items():
        out.setdefault(d2['Passwd'], []).append(k)

print(out)
Run Code Online (Sandbox Code Playgroud)

带有以下变体defaultdict

from collections import defaultdict

out = defaultdict(list)

for d1 in data.values():
    for k, d2 in d1.items():
        out[d2['Passwd']].append(k)

print(dict(out))
Run Code Online (Sandbox Code Playgroud)

输出:

{'e1c2a06545de9164d7e87cd98bed57c5': ['00066554466'],
 'ecb95502daace7f46bf12b484d086e5b': ['8745212300', '8745212301', '8745212302']}
Run Code Online (Sandbox Code Playgroud)