Python 以键和值作为子列表的反向字典

Python 以键和值作为子列表的反向字典,python,list-comprehension,Python,List Comprehension,我想看看是否有人能想出一个办法来解决我遇到的问题 我想尝试以某种方式翻转字典的子列表和列表。以下是我的目标 olddict={ “第1类”:{ “a”:0.962888346949395, “b”:0.2215033887861984, “c”:0.011300919842312747, “d”:0.006507874528179097, “e”:0.0038535645472061657}, 'Cat2':{'a':0.9984095005831831, “b”:0.7831176833025

我想看看是否有人能想出一个办法来解决我遇到的问题

我想尝试以某种方式翻转字典的子列表和列表。以下是我的目标

olddict={
“第1类”:{
“a”:0.962888346949395,
“b”:0.2215033887861984,
“c”:0.011300919842312747,
“d”:0.006507874528179097,
“e”:0.0038535645472061657},
'Cat2':{'a':0.9984095005831831,
“b”:0.7831176833025262,
“c”:0.2980289093298292,
“d”:0.04152023948978264,
“e”:0.9772639691714836},
'Cat3':{'a':0.467005076142132,
“b”:1.0,
“c”:0.9810315430520035,
“d”:0.37869041728517233,
“e”:0.5812393632996296}
变成这样:

newdict={
“a”:{
“Cat1”:0.9628883464694395,
“第二类”:0.9984095005831831,
“Cat3”:0.467005076142132},
“b”:{
“Cat1”:0.22150338887861984,
“第二类”:0.7831176833025262,
“Cat3”:1.0},
“c”:{
“Cat1”:0.011300919842312747,
“Cat2”:0.2980289093298292,
“Cat3”:0.9810315430520035},
“d”:{
“Cat1”:0.9628883464694395,
“Cat2”:0.04152023948978264,
“Cat3”:0.37869041728517233},
“e”:{
“Cat1”:0.0038535645472061657,
“Cat2”:0.9772639691714836,
“Cat3”:0.5812393632996296}
有了这个,我就可以创建新词典的总体布局了。但是,我在添加值方面也失败了

newdict={}
对于键,olddict.items()中的值:
对于字符串,v在value.items()中:
newdict.setdefault(字符串,[]).append(键)

我将感谢任何帮助。非常感谢

尝试使用
defaultdict
。它们很神奇

>>从集合导入defaultdict
>>>从pprint导入pprint
>>>
>>>newdict=defaultdict(dict)
>>>对于键,olddict.items()中的值:
...     对于字符串,v在value.items()中:
...             newdict[string][key]=v
>>>
>>>pprint(纽迪克特)
defaultdict(,
{'a':{'Cat1':0.9628883464694395,
“第二类”:0.9984095005831831,
“Cat3”:0.467005076142132},
'b':{'Cat1':0.2215033887861984,
“第二类”:0.7831176833025262,
“Cat3”:1.0},
‘c’:{‘Cat1’:0.011300919842312747,
“Cat2”:0.2980289093298292,
“Cat3”:0.9810315430520035},
'd':{'Cat1':0.006507874528179097,
“Cat2”:0.04152023948978264,
“Cat3”:0.37869041728517233},
'e':{'Cat1':0.0038535645472061657,
“Cat2”:0.9772639691714836,
“Cat3”:0.5812393632996296})
输出:

{'a': {'Cat1': 0.9628883469409395,
  'Cat2': 0.9984095005831831,
  'Cat3': 0.467005076142132},
 'b': {'Cat1': 0.2215033887861984, 'Cat2': 0.7831176833025262, 'Cat3': 1.0},
 'c': {'Cat1': 0.011300919842312747,
  'Cat2': 0.2980289093298292,
  'Cat3': 0.9810315430520035},
 'd': {'Cat1': 0.006507874528179097,
  'Cat2': 0.04152023948978264,
  'Cat3': 0.37869041728517233},
 'e': {'Cat1': 0.0038535645472061657,
  'Cat2': 0.9772639691714836,
  'Cat3': 0.5812393632996296}}

您使用
setdefault
的解决方案几乎是正确的,但您使用的是DICT,而不是列表,因此您应该执行以下操作:

olddict = {'Cat1': {'a': 0.9628883469409395,
  'b': 0.2215033887861984,
  'c': 0.011300919842312747,
  'd': 0.006507874528179097,
  'e': 0.0038535645472061657},
'Cat2': {'a': 0.9984095005831831,
  'b': 0.7831176833025262,
  'c': 0.2980289093298292,
  'd': 0.04152023948978264,
  'e': 0.9772639691714836},
'Cat3': {'a': 0.467005076142132,
  'b': 1.0,
  'c': 0.9810315430520035,
  'd': 0.37869041728517233,
  'e': 0.5812393632996296}}

expected = {'a': {'Cat1': 0.9628883469409395,
  'Cat2': 0.9984095005831831,
  'Cat3': 0.467005076142132},
'b': {'Cat1': 0.2215033887861984,
  'Cat2': 0.7831176833025262,
  'Cat3': 1.0},
'c': {'Cat1': 0.011300919842312747,
  'Cat2': 0.2980289093298292,
  'Cat3': 0.9810315430520035},
'd': {'Cat1': 0.006507874528179097,
  'Cat2': 0.04152023948978264,
  'Cat3': 0.37869041728517233},
'e': {'Cat1': 0.0038535645472061657,
  'Cat2': 0.9772639691714836,
  'Cat3': 0.5812393632996296}}

newdict = {}
for key, value in olddict.items():
    for s, v in value.items():
        newdict.setdefault(s, {})[key] = v
print(newdict == expected)
# True
import pandas as pd 
olddict = {'Cat1': {'a': 0.9628883469409395,
  'b': 0.2215033887861984,
  'c': 0.011300919842312747,
  'd': 0.006507874528179097,
  'e': 0.0038535645472061657},
'Cat2': {'a': 0.9984095005831831,
  'b': 0.7831176833025262,
  'c': 0.2980289093298292,
  'd': 0.04152023948978264,
  'e': 0.9772639691714836},
'Cat3': {'a': 0.467005076142132,
  'b': 1.0,
  'c': 0.9810315430520035,
  'd': 0.37869041728517233,
  'e': 0.5812393632996296}} 
df=pd.DataFrame(olddict)
df = df.T 
df.to_dict() 
{'a': {'Cat1': 0.9628883469409395,
  'Cat2': 0.9984095005831831,
  'Cat3': 0.467005076142132},
 'b': {'Cat1': 0.2215033887861984, 'Cat2': 0.7831176833025262, 'Cat3': 1.0},
 'c': {'Cat1': 0.011300919842312747,
  'Cat2': 0.2980289093298292,
  'Cat3': 0.9810315430520035},
 'd': {'Cat1': 0.006507874528179097,
  'Cat2': 0.04152023948978264,
  'Cat3': 0.37869041728517233},
 'e': {'Cat1': 0.0038535645472061657,
  'Cat2': 0.9772639691714836,
  'Cat3': 0.5812393632996296}}
olddict = {'Cat1': {'a': 0.9628883469409395,
  'b': 0.2215033887861984,
  'c': 0.011300919842312747,
  'd': 0.006507874528179097,
  'e': 0.0038535645472061657},
'Cat2': {'a': 0.9984095005831831,
  'b': 0.7831176833025262,
  'c': 0.2980289093298292,
  'd': 0.04152023948978264,
  'e': 0.9772639691714836},
'Cat3': {'a': 0.467005076142132,
  'b': 1.0,
  'c': 0.9810315430520035,
  'd': 0.37869041728517233,
  'e': 0.5812393632996296}}

expected = {'a': {'Cat1': 0.9628883469409395,
  'Cat2': 0.9984095005831831,
  'Cat3': 0.467005076142132},
'b': {'Cat1': 0.2215033887861984,
  'Cat2': 0.7831176833025262,
  'Cat3': 1.0},
'c': {'Cat1': 0.011300919842312747,
  'Cat2': 0.2980289093298292,
  'Cat3': 0.9810315430520035},
'd': {'Cat1': 0.006507874528179097,
  'Cat2': 0.04152023948978264,
  'Cat3': 0.37869041728517233},
'e': {'Cat1': 0.0038535645472061657,
  'Cat2': 0.9772639691714836,
  'Cat3': 0.5812393632996296}}

newdict = {}
for key, value in olddict.items():
    for s, v in value.items():
        newdict.setdefault(s, {})[key] = v
print(newdict == expected)
# True