【发布时间】:2017-12-04 16:50:52
【问题描述】:
如何将python字典d = {1:10, 2:20, 3:30, 4:30}转换为{10: [1], 20: [2], 30: [3, 4]}?
我需要反转一个字典,值应该成为另一个字典的键,并且值应该是列表中的键,即也在排序的问题中。
【问题讨论】:
标签: list python-3.x dictionary reverse
如何将python字典d = {1:10, 2:20, 3:30, 4:30}转换为{10: [1], 20: [2], 30: [3, 4]}?
我需要反转一个字典,值应该成为另一个字典的键,并且值应该是列表中的键,即也在排序的问题中。
【问题讨论】:
标签: list python-3.x dictionary reverse
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]}
【讨论】:
这个 SO 问题解释了如何在 Python 2.7.x 和 3+ 中执行此操作:
Python reverse / invert a mapping
在下面的答案中显示了这种方法:
inv_map = {}
for k, v in d.iteritems():
inv_map[v] = inv_map.get(v, [])
inv_map[v].append(k)
最好。
【讨论】:
{10: 1, 20: 2, 30: 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 方法更简单、更快。此外,它返回一个 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]})
【讨论】:
在 python dict 中反转键和值有点棘手。您应该记住,python dict 必须有一个 unique 键。
因此,如果您知道在反转当前 dict 的键和值时将具有唯一键,您可以使用简单的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]}
【讨论】: