【问题标题】:How to invert a Dict[object, object] to get Dict[object, list]? [duplicate]如何反转 Dict[object, object] 以获得 Dict[object, list]? [复制]
【发布时间】:2020-03-25 23:49:32
【问题描述】:

我查看了另一个反转问题,但那个问题没有带列表的字典,所以这对我没有帮助。

所以我有一本字典,基本上我想把它倒过来。所以键变成了值,值变成了键。例如,如果我有:{'Sun' : ['hot', 'yellow'], 'Car': ['yellow'], 'Fire': ['hot']}, 它应该返回:{'yellow': ['Sun', 'Car'], 'hot': ['Sun', 'Fire']}

我尝试只获取键值,但我不知道如何将它们放入字典并将键值分配给它们。 我会很感激任何帮助,但如果可能的话,请使用最基本的方法 谢谢

【问题讨论】:

  • @LocalhostNotfound 这就是我最初的想法,但不完全是
  • 向下滚动以回答非唯一项目
  • @DavidBuck 那个不包括列表所以它对我没有帮助

标签: python dictionary


【解决方案1】:
from collections import OrderedDict

def invert(d):
    inversion = {}
    for key, vals in d.items():
        for val in vals:
            lst = inversion.get(val, None)
            if lst is None:
                lst = []
                inversion[val] = lst
            lst.append(key)
    for lst in inversion.values():
        lst.sort()
    return OrderedDict(sorted(inversion.items()))

print(invert({'Sun' : ['hot', 'yellow'], 'Car': ['yellow'], 'Fire': ['hot']}))
#-> OrderedDict([('hot', ['Fire', 'Sun']), ('yellow', ['Car', 'Sun'])])

【讨论】:

  • 谢谢。只是想问你如何对这些进行排序,因为你不能只使用 .sort()
  • @lankup90 来自 python 3.7 dicts 是插入排序的。如果您指的是列表,则可以使用 .sort()...
  • 如果你想对字典中的键进行排序,你应该使用 OrderedDict;如果您希望对倒排索引中的值进行排序,则应添加一个后处理步骤来对它们进行排序。我将更新示例以向您展示如何操作。
  • @Dylon 非常感谢!我只需要对列表进行排序,感谢您的帮助。
  • 这个逻辑过于复杂——当你从集合中获取OrderedDict时,同时获取defaultdict并初始化inversion = defaultdict(list)。然后,您可以假设 inversion 中的值存在并且您可以附加到它们:inversion[val].append(key) 而不事先进行 any 测试。当您使用它时:map(list.sort, inversion.values()) 而不是您的循环。
猜你喜欢
  • 2020-11-07
  • 2019-05-18
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 2017-04-07
相关资源
最近更新 更多