[英]How can one switch the value and key of a Nested dictionary in Python?
我正在为医生和医院编写延迟接受算法,但是在到达那里之前,我需要以正确的方式展示我的词典。
目前,我有一本医生字典,其中包含嵌套的字典,其中列出了医院的排名:
{'Doctor_7': {'Hospital_6': 4.0, 'Hospital_3': 8.0, 'Hospital_1': 10.0, 'Hospital_8': 1.0, 'Hospital_2': 9.0, 'Hospital_10': 5.5, 'Hospital_5': 5.5, 'Hospital_7': 2.0, 'Hospital_4': 7.0, 'Hospital_9': 3.0}
在这里,“ Hospital_6”表示医院,4.0表示该医生的排名(在这种情况下,十分之四)
由于我制作此字典所使用的DataFrame,因此以其当前形式表示。 但是,我想切换“ Hospital_6”和4.0的位置。 因此,我希望4.0是键,而Hospital_6是它的值(嵌套字典的值)。
但是,我不太了解如何切换这两个。 如果有人可以帮助我,将不胜感激!
old_dict = {'Doctor_7': {'Hospital_6': 4.0, 'Hospital_3': 8.0, 'Hospital_1': 10.0, 'Hospital_8': 1.0, 'Hospital_2': 9.0, 'Hospital_10': 5.5, 'Hospital_5': 5.5, 'Hospital_7': 2.0, 'Hospital_4': 7.0, 'Hospital_9': 3.0}
new_dict = {doctor: OrderedDict(sorted(((value, hospital) for hospital, value in values.items()),
key=lambda p: p[0]))
for doctor, values in old_dict.items()}
产出
{'Doctor_7': OrderedDict([(1.0, 'Hospital_8'),
(2.0, 'Hospital_7'),
(3.0, 'Hospital_9'),
(4.0, 'Hospital_6'),
(5.5, 'Hospital_5'),
(7.0, 'Hospital_4'),
(8.0, 'Hospital_3'),
(9.0, 'Hospital_2'),
(10.0, 'Hospital_1')])}
您可以使用dict Comprehension来实现此目的:
dict_ ={'Doctor_7': {'Hospital_6': 4.0, 'Hospital_3': 8.0, 'Hospital_1': 10.0, 'Hospital_8': 1.0, 'Hospital_2': 9.0, 'Hospital_10': 5.5, 'Hospital_5': 5.5, 'Hospital_7': 2.0, 'Hospital_4': 7.0, 'Hospital_9': 3.0 }}
new_dict = {key:{v:k for k,v in value.items()} for key, value in dict_.items()}
print(new_dict)
要了解更多关于快译通理解: 按照本
注意:它将覆盖重复的键,这些键是上一字典中的值。 如果您拥有两家评级相同的医院,那么您将只会获得一家。
{'Doctor_7': {4.0: 'Hospital_6',
8.0: 'Hospital_3',
10.0: 'Hospital_1',
1.0: 'Hospital_8',
9.0: 'Hospital_2',
5.5: 'Hospital_5',
2.0: 'Hospital_7',
7.0: 'Hospital_4',
3.0: 'Hospital_9'}}
由于到目前为止,这两种解决方案都忽略了重复密钥的处理(对多家医院给予相同的评级),因此这里有一种解决方案。
缺点是每个等级都指向具有该等级的医院列表,而不是直接指向名称,即使该列表的长度为一个。
from collections import defaultdict
d = {'Doctor_7': {'Hospital_6': 4.0,
'Hospital_3': 8.0,
'Hospital_1': 10.0,
'Hospital_8': 1.0,
'Hospital_2': 9.0,
'Hospital_10': 5.5,
'Hospital_5': 5.5,
'Hospital_7': 2.0,
'Hospital_4': 7.0,
'Hospital_9': 3.0}}
new_d = {}
for doctor, ratings in d.items():
ratings_inverse = defaultdict(list)
for hospital, rating in ratings.items():
ratings_inverse[rating].append(hospital)
new_d[doctor] = dict(ratings_inverse)
print(new_d)
# {'Doctor_7': {1.0: ['Hospital_8'],
# 2.0: ['Hospital_7'],
# 3.0: ['Hospital_9'],
# 4.0: ['Hospital_6'],
# 5.5: ['Hospital_10', 'Hospital_5'],
# 7.0: ['Hospital_4'],
# 8.0: ['Hospital_3'],
# 9.0: ['Hospital_2'],
# 10.0: ['Hospital_1']}}
但是,由于您提到了一个数据pandas.DataFrame
,所以如果它是一个pandas.DataFrame
:
# Doctor_1 Doctor_7
# Hospital_1 1.0 10.0
# Hospital_10 8.0 5.5
# Hospital_2 3.0 9.0
# Hospital_3 10.0 8.0
# Hospital_4 6.0 7.0
# Hospital_5 8.0 5.5
# Hospital_6 4.0 4.0
# Hospital_7 4.0 2.0
# Hospital_8 9.0 1.0
# Hospital_9 3.0 3.0
您可以执行以下操作:
df.apply(lambda col: col.reset_index()\
.groupby(col.name)["index"]\
.apply(lambda x: x.tolist()))
# Doctor_1 Doctor_7
# 1.0 [Hospital_1] [Hospital_8]
# 2.0 NaN [Hospital_7]
# 3.0 [Hospital_2, Hospital_9] [Hospital_9]
# 4.0 [Hospital_6, Hospital_7] [Hospital_6]
# 5.5 NaN [Hospital_10, Hospital_5]
# 6.0 [Hospital_4] NaN
# 7.0 NaN [Hospital_4]
# 8.0 [Hospital_10, Hospital_5] [Hospital_3]
# 9.0 [Hospital_8] [Hospital_2]
# 10.0 [Hospital_3] [Hospital_1]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.