2017-06-30 46 views
1

如何把python字典d = {1:10, 2:20, 3:30, 4:30}转换为{10: [1], 20: [2], 30: [3, 4]}在python中翻转字典?

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

回答

0
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

尽管此代码可以回答这个问题,提供了关于如何和/或为什么它解决了这个问题将改善答案的长期价值附加的上下文。 –

0

这太问题介绍了如何在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) 

是最好的。

+0

它不会在按键中发生碰撞的情况下创建列表。即结果为'{10:1,20:2,30:4}' –

+0

在这种情况下,您的解决方案将是最佳选择。编辑。 – QuantumVertex

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

试试这个!

0

此用例很容易被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]}) 
0

颠倒python字典中的键和值是有点棘手。你应该记住,python字典必须有一个unique键。

所以,如果你知道倒车键和当前字典的值时,将有一个独特的键,你可以用一个简单的dict comprehension像这样的例子:

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

但是,您可以使用groupbyitertools模块像这样的例子:

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