web-dev-qa-db-fra.com

Comment inverser un dictionnaire (dont les valeurs sont des listes) en Python?

Je voudrais écrire une fonction qui reçoit un dictionnaire en tant qu'argument d'entrée et retourne une inversion du dictionnaire en entrée où les valeurs du dictionnaire d'origine sont utilisées comme clés pour le dictionnaire renvoyé et les clés du dictionnaire d'origine sont utilisées en tant que valeur pour le dictionnaire. dictionnaire retourné comme expliqué ci-dessous: 

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']}

La liste des valeurs du dictionnaire renvoyé doit être triée par ordre croissant. La capitalisation n'a pas d'importance. Cela signifie que tous les mots doivent être convertis en lettres minuscules. Par exemple, le mot "exact" est en majuscule dans le dictionnaire d'origine mais dans le dictionnaire renvoyé, il est écrit avec toutes les lettres minuscules.

#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

Mais il retourne cette erreur cependant:

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

Vous pouvez le faire très simplement comme ceci:

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

Je commencerais par échanger les clés/valeurs à l'aide d'un dict par défaut:

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

Et enfin le tri:

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

Utilisez une compréhension dictée!

>>> 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'}

TL; DR:

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

c'est la réponse, sans utiliser aucun module:

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
0
Shb8086

Comment je renverse un dict:

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

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