簡體   English   中英

如何在 Python 中反轉字典(其值為列表)?

[英]How to reverse a dictionary (whose values are lists) in Python?

我想編寫一個函數,它接收字典作為輸入參數並返回輸入字典的反向,其中原始字典的值用作返回字典的鍵,原始字典的鍵用作輸入字典的值返回字典,解釋如下:

dict = {'Accurate': ['exact', 'precise'], 
        'exact': ['precise'], 
        'astute': ['Smart', 'clever'], 
        'smart': ['clever', 'bright', 'talented']}

dict = {'precise': ['accurate', 'exact'], 
        'clever': ['astute', 'smart'], 
        'talented': ['smart'], 
        'bright': ['smart'],
        'exact': ['accurate'],
        'smart': ['astute']}

返回字典中的值列表應按升序排序。 大小寫無關緊要。 這意味着所有單詞都應轉換為小寫字母。 例如,單詞“Accurate”在原始字典中是大寫的,但在返回的字典中它是全部用小寫字母書寫的。

#My code is:
from collections import defaultdict
def reverse_dictionary(input_dict):
   d = defaultdict(list)
   for v,k in input_dict.items():
       d[k].append(v)
       return d

但它會返回此錯誤:

Error in evaluating function:
TypeError at line 6
unhashable type: 'list'

你可以很簡單地這樣做:

newdict = {}
for key, value in olddict.items():
    for string in value:
        newdict.setdefault(string, []).append(key)

我將首先使用默認字典交換鍵/值:

output_dict = defaultdict(list)
for key, values in input_dict.items():
    for value in values:
        output_dict[value.lower()].append(key.lower())

最后排序:

for key, values in output_dict.items():
    output_dict[key] = sorted(values)

使用字典理解!

>>> evil_petting_zoo = {'bear':3, 'crocodile':1,'kangaroo':2,'goat':0}
>>> evil_petting_zoo.items()

dict_items([('bear', 3), ('crocodile', 1), ('kangaroo', 2), ('goat', 0)])

>>> {i[1]:i[0] for i in evil_petting_zoo.items()}

{3: 'bear', 1: 'crocodile', 2: 'kangaroo', 0: 'goat'}

特爾;博士:

{i[1]:i[0] for i in myDictionary.items()}

我如何反轉字典:

def reverse(org):
    return {v: k for k, v in org.items()}

print(reverse({1: 'a', 2: 'b'}))
# {'a': 1, 'b': 2}

對於函數式編程的熱愛,這里有一個有趣的方式:

from itertools import product
from more_itertools import map_reduce, flatten

olddict =  {'Accurate': ['exact', 'precise'], 
        'exact': ['precise'], 
        'astute': ['Smart', 'clever'], 
        'smart': ['clever', 'bright', 'talented']}

value_key_pairs = flatten(product(v,(k,)) for k,v in olddict.items())
out = map_reduce(value_key_pairs, lambda k:k[0].lower(), lambda k:k[1].lower())

assert dict(out) == {'exact': ['accurate'], 'precise': ['accurate', 'exact'], 'smart': ['astute'], 'clever': ['astute', 'smart'], 'bright': ['smart'], 'talented': ['smart']}

這是答案,不使用任何模塊:

def reverse_dictionary(input_dict):
    out = {}
    for v in input_dict.values():  
        for value in v:
            if value not in out:
                out[value.lower()] = []
    for i in input_dict:
        for j in out:
            if j in map (lambda x : x.lower(),input_dict[i]):
                out[j].append(i.lower())
                out[j].sort()
    return out

暫無
暫無

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

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