我有这个数据:
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
,但结果从来都不是我需要的。
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)