2016-04-13 3 views
0

Im Moment habe ich ein Wörterbuch wie folgt:Der beste Weg, um ein Wörterbuch mit einer Liste als Werte umzukehren?

app_dict = {test1 : [[u'app-1', u'app-2', u'app-3', u'app-4']]} 

Ich habe eine Funktion, die das Wörterbuch umkehrt (die mit einem anderen Wörterbuch zu arbeiten bewiesen ist).

def reverse_dictionary(self, app_dict): 
    """ In order to search by value, reversing the dictionary """ 
    return dict((v,k) for k in app_dict for v in app_dict[k]) 

Ich erhalte eine Fehlermeldung, wenn ich wie folgt vorgehen:

data = reverse_dictionary(app_dict) 
print data 

ERROR: 
return dict((v,k) for k in app_dict for v in app_dict[k]) 
TypeError: unhashable type: 'list' 

Ich bin nicht sicher, aber ich denke, die Frage ist, wie mit meinem Wörterbuch strukturiert ist, ich bin nicht sicher, warum es sind doppelte Klammern auf meiner Liste, und ich kann nicht scheinen, sie zu entfernen. Wie kann ich die Funktion reverse_dictionary so ändern, dass sie mit app_dict funktioniert?

EDIT:

new_dict = collections.defaultdict(list) 
app_dict = collections.defaultdict(list) 

#at this point, we have filled app_dict with data (cannot paste here) 
for o, q in app_dict.items(): 
    if q[0]: 
     new_dict[o].append(q[0]) 

Beachten Sie, dass, wenn ich new_dict an dieser Stelle mein Wörterbuch Werte zeigen im folgenden Format (mit Doppel Klammern) drucken: [[u'app-1' , u'app -2' , u'app-3' , u'app-4' ]]

Wenn ich die append Linie zu ändern: new_dict [o] .append (q [0] [0]) Was ich nehme an, dass die äußeren Klammern entfernt werden, stattdessen fügt es nur den ersten Wert in der Liste hinzu:

[u'app-1'] 

Ich glaube, das ist das Problem, das ich habe, ist nicht in der Lage, die äußeren Klammern erfolgreich von der Liste zu entfernen.

+0

Hinweis: Die doppelten eckige Klammern sind eine Liste in einer anderen Liste – Izkata

+0

Sehen Sie bitte meine aktualisiert Post – david

+0

Ich weiß, das ist die Frage, aber ich bin nicht sicher, wie es zu korrigieren. – david

Antwort

0

Wenn ich deine Bearbeitung verwenden, könnte dies funktionieren

new_dict = collections.defaultdict(list) 
app_dict = collections.defaultdict(list) 

#at this point, we have filled app_dict with data (cannot paste here) 
for o, q in app_dict.items(): 
    if q[0]: 
     for value in q[0]: 
      new_dict[o].append(value) 
+0

Wie füge ich einfach eine einzelne Liste von Werten an mein Diktat an? Derzeit scheint es so, als ob ich entweder nur eine Liste innerhalb einer Liste oder jedes einzelne Element anhängen könnte. Ich scheine zwischen diesen beiden zu springen, anstatt nur eine Liste zu haben. – david

+0

Ich habe versucht, Ihre aktualisierte Funktion und bekam TypeError: Liste Indizes müssen Ganzzahlen sein, nicht Unicode – david

+0

Okay, ich aktualisierte in Bezug auf Ihre eigenen Bearbeitungen. –

1

Der Fehler ist einfach zu sagen, dass die Listen nicht als Schlüssel in einem Wörterbuch verwendet werden, da sie wandelbar sind. Tupel sind jedoch unveränderlich und können daher als Schlüssel verwendet werden.

Eine mögliche Arbeit könnte um sein:

def reverse_dictionary(self, app_dict): 
    """ In order to search by value, reversing the dictionary """ 
    return dict((v,k) if type(v) != list else (tuple(v), k) for k in app_dict for v in app_dict[k]) 
+0

Ich habe meinen Beitrag aktualisiert – david

0

Dies ist die gleiche umgekehrte Funktion wie die, die Sie haben aber berücksichtigt, dass das Wörterbuch eine Liste von Listen wird nur das erste Element verwendet, auf denen enthält. Ich glaube, dass die Daten nicht im richtigen Format vorliegen und daher die doppelten Klammern, aber mit dieser Änderung funktioniert es.

>>> dict([(v, k) for k in app_dict for v in app_dict[k][0]]) 
{u'app-4': 'test1', u'app-3': 'test1', u'app-2': 'test1', u'app-1': 'test1'} 
+1

Während dieser Code die Frage beantworten kann, bietet zusätzliche Kontext in Bezug auf warum und/oder wie es die Frage beantwortet würde erheblich seinen langfristigen Wert zu verbessern.Bitte [bearbeiten] Sie Ihre Antwort, um eine Erklärung hinzuzufügen. – CodeMouse92

Verwandte Themen