在Python中反转字典不会产生结果

时间:2019-03-19 23:30:12

标签: python python-3.x

我正在做一个作业,要求我创建一个字典,然后根据“ Think Python”预订函数将其反转。该功能必须反转我的字典并将每个列表项转换为单独的键。

我创建了一个字典,为了进行分配,该字典显示了类似的足球运动员,但是我认为我的函数现在应该返回倒排的字典,但不是。

    def soccer():
    splayers = dict()
splayers = {'Ronaldo': 'Messi', 'Buffon': 'Courtois', 'Mbappe': 'Vinicius'}
def invert_dict(splayers):
     inverse = dict()
     for key in splayers:
          val = splayers[key]
          if val not in inverse:
               inverse[val] = [key]
          else:
               inverse[val].append(key)
     return inverse

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用setdefault()方法使此操作更简单。

splayers = {'Ronaldo': 'Messi', 'Buffon': 'Courtois', 'Mbappe': 'Vinicius'}
inverted = dict()
for k,v in splayers.items():
    inverted.setdefault(v,[]).append(k)

您还可以使用itertools中的groupby()在同一行上执行此操作,但效率较低且不易理解:

from itertools import groupby
inverted = { key:list(values) for key,values in groupby(sorted(splayers),lambda x:splayers[x]) }

答案 1 :(得分:0)

使用dict comprehension

>> splayers = {'Ronaldo': 'Messi', 'Buffon': 'Courtois', 'Mbappe': 'Vinicius'}
>> splayers_inv = {value: key for key, value in splayers.items()}
>> splayers_inv
{'Courtois': 'Buffon', 'Messi': 'Ronaldo', 'Vinicius': 'Mbappe'}