如何把python字典d = {1:10, 2:20, 3:30, 4:30}
转换为{10: [1], 20: [2], 30: [3, 4]}
?在python中翻转字典?
我需要反转一个字典,这些值应该成为另一个字典的关键字,并且这些值应该是列表中的关键字,也就是在排序的事物中。
如何把python字典d = {1:10, 2:20, 3:30, 4:30}
转换为{10: [1], 20: [2], 30: [3, 4]}
?在python中翻转字典?
我需要反转一个字典,这些值应该成为另一个字典的关键字,并且这些值应该是列表中的关键字,也就是在排序的事物中。
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]}
这太问题介绍了如何在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}' –
在这种情况下,您的解决方案将是最佳选择。编辑。 – QuantumVertex
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。这有一个稍微更复杂的设置,但内循环访问比设置默认方法更简单和更快。此外,它返回一个字典子类,而不是一个纯字典:
>>> 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()}
但是,您可以使用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]}
尽管此代码可以回答这个问题,提供了关于如何和/或为什么它解决了这个问题将改善答案的长期价值附加的上下文。 –