将字典反转为键:值列表? [重复]

问题描述 投票:0回答:4

How to convert a python dictionary

d = {1:10, 2:20, 3:30, 4:30}
to
{10: [1], 20: [2], 30: [3, 4]}
?

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

python-3.x list dictionary mapping reverse
4个回答
6
投票

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

unique
键。

所以,如果你知道在反转当前字典的键和值时会有一个唯一的键,你可以使用一个简单的

dict comprehension
,就像这个例子:

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

但是,您可以使用

groupby
模块中的
itertools
就像这个例子:

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

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 方法更简单和更快。此外,它返回一个 dict 子类而不是一个普通的 dict:

>>> 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
投票
d = {1:10, 2:20, 3:30, 4:30}
inv = {}
for key, val in d.iteritems():
    inv[val] = inv.get(val, []) + [key]

试试这个!


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

© www.soinside.com 2019 - 2024. All rights reserved.