![](/img/trans.png)
[英]How do I efficiently extract all elements in a column from a dictionary whose values are 2D lists in Python?
[英]In python, how do I invert a 2D dictionary?
我有一個以下形式的字典
dict = {
"a" : {"a1" : 1},
"b" : {"a2" : 1, "a3" : 2},
"c" : {"a2" : 3, "a4" : 3}
}
我需要反向索引字典,在這種形式:
inverseDict = {
"a1" : {"a" : 1},
"a2" : {"b" : 1, "c" : 3},
"a3" : {"b" : 2},
"a4" : {"c" : 3}
}
基本上
inverseDict = {dict.value.key : { dict.key : dict.value.value}}
基本上,我需要將值的鍵作為鍵,將鍵作為值的鍵,同時將重復的新鍵等結果連接起來。
我試過這樣做
ks = dict.keys()
vals = dict.values()
ks2 = vals.keys()
vals2 = vals.values()
如果這有任何意義
但是我收到了一個錯誤
'dict_values' object has no attribute 'keys'
根據我的理解,因為dict.values()。keys().items()返回“views”而不是實際的元素本身,但我不知道如何解決這個問題。
還有一個我應該考慮的更有效的解決方案,因為我的實際dict非常大(~10k鍵),結果反轉dict也會很大(> 3k鍵)
使用collections.defaultdict(dict)
和雙循環它很容易:
d = {
"a" : {"a1" : 1},
"b" : {"a2" : 1, "a3" : 2},
"c" : {"a2" : 3, "a4" : 3},
}
import collections
inverted = collections.defaultdict(dict)
for key,subd in d.items():
for k,v in subd.items(): # no inspiration for key/value names...
inverted[k][key] = v
inverted
{'a1': {'a': 1},
'a2': {'b': 1, 'c': 3},
'a3': {'b': 2},
'a4': {'c': 3}}
使用defaultdict
避免測試條目是否已存在並創建字典值(如果不存在)。 因此,只需按預期順序無腦地添加鍵/值。
請注意,使用理解很難解決那些需要將項目處理成多個對象的問題。
另一個解決方案沒有標准的lib ...但Jean-Francois Fabre的答案更簡潔,可能更容易模塊化。 如有疑問,請使用標准庫。
OriginalDict = ... (Original dict items)
InvertedDict = {}
for k, v in OriginalDict.items():
for k_, v_ in v.items():
if InvertedDict.get(k_) is None:
InvertedDict[k_] = {}
InvertedDict[k_][k] = v_
你可以使用setdefault :
d = {
'a': {'a1': 1},
'b': {'a2': 1, 'a3': 2},
'c': {'a2': 3, 'a4': 3}
}
result = {}
for ok, vs in d.items():
for ik, v in vs.items():
result.setdefault(ik, {})[ok] = v
print(result)
產量
{'a4': {'c': 3}, 'a1': {'a': 1}, 'a2': {'c': 3, 'b': 1}, 'a3': {'b': 2}}
函數setdefault
與defaultdict
的用法類似。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.