2016-03-11 18 views
11

Chciałbym napisać funkcję, która odbiera słownik jako argument wejściowy i zwraca odwrotność słownika wejściowego, w którym wartości oryginalnego słownika są używane jako klucze dla zwróconego słownika, a klucze oryginalnego słownika są używane jako wartość dla wracającej słowniku jak poniżej:Jak odwrócić słownik w Pythonie?

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

do

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

listę wartości w zwróconym słownika powinny być sortowane w porządku rosnącym. Kapitalizacja nie ma znaczenia. Oznacza to, że wszystkie słowa powinny być konwertowane na małe litery. Na przykład słowo "dokładny" jest pisane wielką literą w oryginalnym słowniku, ale w zwracanym słowniku jest napisane wszystkimi małymi literami.

#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 

ale zwraca ten błąd, jednak:

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

Problem polega na tym, że nie można użyć żadnego obiektu jako klucza - obiekty te muszą być niezmienne, tak aby ich hash va Lue nie zmienia się po dodaniu do słownika. W twoim przypadku listy są zmienne, więc nie mogą być używane jako klucze. Zamiast tego możesz zamienić je na krotki. –

+2

Witamy w StackExchange! Warto zastanowić się nad tym problemem. Na przykład, dlaczego "Dokładnie": ["dokładny", "precyzyjny"] "staje się" precyzyjny ": [" dokładny "," dokładny "]" zamiast "" dokładny ": [" dokładny "," dokładny "; "]'? Jeśli chodzi o twój komunikat o błędzie, lista nie może być twoim kluczem do dyktowania, ale myślę, że większy problem polega na tym, że twoje zadanie wymaga wyjaśnienia. –

+0

Również słowniki nie mogą być sortowane. –

Odpowiedz

5

Możesz zrobić to po prostu l Ike to:

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

Zawsze, zawsze, zawsze używaj słów dyktowanych, gdy pojawia się szansa :) – DaveBensonPhillips

+0

Czy możesz dać przykład? Po prostu nie mogłem wymyślić takiego, który zadziałałby. – zondo

+0

Och, oops - Myślałem, że to, co zrobiłeś, byłem głupi.Nie próbowałem być protekcjonalny, ale zdaję sobie sprawę, że dokładnie tak się stało, przepraszam. – DaveBensonPhillips

4

Chciałbym rozpocząć poprzez zamianę klawiszy/wartości przy użyciu domyślnego dict:

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

I wreszcie Sortowanie:

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

Skorzystaj ze zrozumienia dla dyktatora!

>>> 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()} 
1

Jak odwrócić dict:

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

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

ta odpowiedź najlepiej pasuje do mojego problemu (i do standardowego klucza: wartość dict). Dzięki ;) –

0

jest to odpowiedź, bez użycia modułu:

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