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

Reverse a dictionary to key : list of values?

如何将 python 字典 d = {1:10, 2:20, 3:30, 4:30} 转换为 {10: [1], 20: [2], 30: [3, 4]}

我需要反转字典,值应该成为另一个字典的键,值应该是列表中的键,即也在排序的事物中。

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]}

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

试试这个!

这个用例很容易被 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 方法更简单和更快。此外,它 returns 一个字典子类而不是一个普通的字典:

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

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

反转 python 字典中的键和值有点棘手。你应该记住 python 字典必须有一个 unique 键。

因此,如果您知道在反转当前字典的键和值时将具有唯一键,您可以使用简单的 dict comprehension 就像这个例子:

{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]}