繁体   English   中英

如何在Python中切换嵌套字典的值和键?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM