如何把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]}
儘管此代碼可以回答這個問題,提供了關於如何和/或爲什麼它解決了這個問題將改善答案的長期價值附加的上下文。 –