将字典反转为键:值列表?

5
如何将Python字典d = {1:10, 2:20, 3:30, 4:30}转换为{10: [1], 20: [2], 30: [3, 4]}
我需要反转一个字典,其中的值应成为另一个字典的键,并且这些值应以列表中的键出现,即按排序顺序。
4个回答

6

将Python字典中的键和值反转有点棘手。您应该知道Python字典必须具有唯一的键。

因此,如果您知道当反转当前字典的键和值时将具有唯一键,则可以使用简单的字典推导式,例如:

{v:k  for k,v in my_dict.items()}

然而,您可以像以下示例一样使用 itertools 模块中的 groupby 来实现:
from itertools import groupby

a = {1:10, 2:20, 3:30, 4:30}
b = {k: [j for j, _ in list(v)] for k, v in groupby(a.items(), lambda x: x[1])}
print(b)

>>> {10: [1], 20: [2], 30: [3, 4]}

1
我不明白如果输入未排序,groupby的方式如何能够起作用。例如,如果我们将a的顺序从{1:10, 2:20, 3:30, 4:30}切换到{1:10, 3:30, 2:20, 4:30},那么group by不会失败吗? - user3240688

5
这个用例可以轻松地使用 dict.setdefault() 来处理。
>>> d = {1:10, 2:20, 3:30, 4:30}
>>> e = {}
>>> for x, y in d.items():
        e.setdefault(y, []).append(x)

>>> e
{10: [1], 20: [2], 30: [3, 4]}

另一种选择是使用collections.defaultdict。这种方法设置略微复杂,但内部循环访问比setdefault方法更简单、更快。此外,它返回的是字典子类而不是普通字典:

>>> e = defaultdict(list)
>>> for x, y in d.items():
        e[y].append(x)

>>> e
defaultdict(<class 'list'>, {30: [3, 4], 10: [1], 20: [2]})

1
o = {}
for k,v in d.iteritems():
    if v in o:
        o[v].append(k)
    else:
        o[v] = [k]

o = {10:[1],20:[2],30:[3, 4]}


1
虽然这段代码可能可以回答问题,但提供有关它如何以及/或为什么解决问题的额外上下文将会增强答案的长期价值。 - Donald Duck

1
d = {1:10, 2:20, 3:30, 4:30}
inv = {}
for key, val in d.iteritems():
    inv[val] = inv.get(val, []) + [key]

尝试一下!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接