簡體   English   中英

如何以給定的格式反轉該詞典?

[英]How do I reverse this dictionary in the format given?

我想將其轉換為:

d={'move': ['liikuttaa'], 'hide': ['piilottaa', 'salata'], 'six': ['kuusi'], 'fir': ['kuusi']}

到這個:

{'liikuttaa': ['move'], 'piilottaa': ['hide'], 'salata': ['hide'], 'kuusi': ['six', 'fir']}

基本上顛倒了這本字典。 同樣,新字典的值應采用列表形式,如圖所示。

我已經嘗試使用zip函數,通過(v,k)進行反轉,但是每次遇到相同的錯誤:“無法哈希的類型列表”。

def reverse_dictionary(d):    
    reverse=list(zip(d.values(),d.keys()))
    return reverse

輸出應為:

{'liikuttaa': ['move'], 'piilottaa': ['hide'], 'salata': ['hide'], 'kuusi': ['six', 'fir']}

您可以將defaultdictlist一起使用:

from collections import defaultdict
from pprint import pprint

d = {'move': ['liikuttaa'],
     'hide': ['piilottaa', 'salata'],
     'six': ['kuusi'],
     'fir': ['kuusi']}

result = defaultdict(list)

for key, values in d.items():
    for value in values:
        result[value].append(key)

pprint(dict(result))

輸出:

{'kuusi': ['fir', 'six'],
 'liikuttaa': ['move'],
 'piilottaa': ['hide'],
 'salata': ['hide']}

或者您可以將普通dictsetdefault

result = {}

for key, values in d.items():
    for value in values:
        result.setdefault(value, []).append(key)

我將首先創建一個生成器,該生成器在現有字典中生成鍵,值對:

def pairs(d):
    for key in d:
        for value in d[key]:
            yield key, value

然后使用defaultdict創建反向結構:

from collections import defaultdict
reversed_d = defaultdict(list)

for key, value in pairs(d):
    reversed_d[value].append(key)

嵌套列表推導將執行以下操作:

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

編輯

我誤會了你的要求。 這個更好:

from collections import defaultdict
new_dict = defaultdict(list)
for k, v in d.items()
    for val in v:
        new_dict[k].append(v)

這並不簡單,字典可逆。 您還需要訪問/創建內部列表並相應地填充內部列表(同時避免在生成的字典上發生鍵沖突)。

一種方法是:

def reverse_dict_special(d):
    result = {}
    for k, vs in d.items():
        for v in vs:
            if v in result:
                result[v].append(k)
            else:
                result[v] = [k]
    return result

d = {'move': ['liikuttaa'], 'hide': ['piilottaa', 'salata'], 'six': ['kuusi'], 'fir': ['kuusi']}
reverse_dict_special(d)
# {'liikuttaa': ['move'],
#  'piilottaa': ['hide'],
#  'salata': ['hide'],
#  'kuusi': ['six', 'fir']}

請注意,這不需要使用dict.setdefault()建議的collections.defaultdictdict.setdefault() 實際上,所提出的方法似乎比其他兩個方法都能更快地得到結果:

from collections import defaultdict

def reverse_dict_special2(d):
    result = defaultdict(list)
    for key, values in d.items():
        for value in values:
            result[value].append(key)
    return result


def reverse_dict_special3(d):
    result = {}
    for key, values in d.items():
        for value in values:
            result.setdefault(value, []).append(key)
    return result


%timeit reverse_dict_special(d)
# 1.22 µs ± 29.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit reverse_dict_special2(d)
# 2.04 µs ± 44 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit reverse_dict_special3(d)
# 1.55 µs ± 18.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

編輯 :起初我誤解了這個問題,並且沒有意識到輸入的內部列表可能有多個項目)

暫無
暫無

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

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