簡體   English   中英

在python中,如何反轉2D字典?

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

函數setdefaultdefaultdict的用法類似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM