web-dev-qa-db-ger.com

Wie kann ich ein Wörterbuch (dessen Werte Listen sind) in Python umkehren?

Ich möchte eine Funktion schreiben, die ein Wörterbuch als Eingabeargument empfängt und eine Umkehrung des Eingabewörterbuchs zurückgibt, wobei die Werte des ursprünglichen Wörterbuchs als Schlüssel für das zurückgegebene Wörterbuch und die Schlüssel des ursprünglichen Wörterbuchs als Wert für das Wörterbuch verwendet werden zurückgegebenes Wörterbuch wie unten erklärt: 

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

zu

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

Die Liste der Werte im zurückgegebenen Wörterbuch sollte aufsteigend sortiert sein. Kapitalisierung spielt keine Rolle. Das bedeutet, dass alle Wörter in Kleinbuchstaben umgewandelt werden sollen. Beispielsweise wird das Wort "genau" im ursprünglichen Wörterbuch groß geschrieben, im zurückgegebenen Wörterbuch jedoch mit allen Kleinbuchstaben.

#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

Es wird jedoch dieser Fehler zurückgegeben:

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

Sie können es ganz einfach so machen:

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

Ich würde damit beginnen, die Schlüssel/Werte mit einem Standarddiktat zu tauschen:

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

Und zum Schluss sortieren:

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

Benutze ein Diktierverständnis!

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

Aus Liebe zur funktionalen Programmierung, hier ist ein lustiger Weg:

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

1
Matthias

dies ist die Antwort, ohne ein Modul zu verwenden:

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

Wie stelle ich ein Diktat um:

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

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