2016-06-23 20 views
0

Ich bin sehr Anfänger in Python, und ich lerne derzeit die Sprache. Ich fand, dass Array von Arrays (assoziative Arrays) als Wörterbücher in Python ({}) aufgerufen werden Ich stehe vor einem Problem. Ich muss ein Wörterbuch erstellen und es in einer Schleife for aktualisieren. Meine Codes sind unten.Python Update-Wörterbuch in Wörterbuch

loc = {} 
result = { I get the list of records from database here, which has id and status } 
for res in result: 
    temp={} 
    temp['id']= res.id 
    temp['status'] = res.status 
    loc.update(temp) # this replaces the values every time, i want append 

print loc 

unten ist das Ergebnis von mir erwartet:

loc = { {'id' : 123 , 'status' : 'available' }, 
     { 'id' : 456 , 'status' : 'unavailable'} 
     } 

Kann mir jemand helfen. Ich habe versucht mit:

loc = [] # [] this works with loc.append(temp) 
this gives result as : 
[{'id' : 123 , 'status' : 'available'},{'id' : 456 , 'status' : 'unavailable'}] 

Aber ich brauche das obige Ergebnis mit Wörterbuch der Wörterbücher in Python.

+2

Ihr erwartetes Ergebnis 'loc' kein dict ist, da sie Schlüssel und Werte nicht enthalten. In einem Diktat haben Sie Schlüssel, deren Werte Wörterbücher sind. Was gedenken Sie als Schlüssel zu verwenden? Warum muss 'loc' ein Diktat sein? Eine Liste von Diktaten, wie in Ihrem unteren Ergebnis gezeigt, scheint gut zu funktionieren. – MattDMo

+0

Dictionary ist ein Schlüssel-Wert-Paar (indiziert durch den Schlüssel). Was ist nun der Schlüssel für das äußere Wörterbuch? – SuperSaiyan

+0

Warum ist loc ein Wörterbuch? –

Antwort

1

Was Sie sagen, ist die gewünschte Ausgabe:

loc = { 
    {'id' : 123 , 'status' : 'available' }, 
    {'id' : 456 , 'status' : 'unavailable'} 
} 

kein dict wäre. Es wäre ein set wenn es überhaupt funktioniert.

Aber ein set kann kein dict enthalten, weil es nicht waschbar ist. Ein Set kann nur hashbare Elemente enthalten, da es den Hash für schnelle Suchvorgänge verwendet. (Ein hashbares Element wäre entweder vollständig unveränderlich oder jede Mutation, die es erfährt, würde den Hash nicht beeinflussen. Beachten Sie, dass die Hash-Funktion keinen Einfluss auf die Gleichheit hat. Im Allgemeinen ist es einfacher zu gewährleisten, dass die Hashes unveränderlich sind.)

In einem Wörterbuch müssen Sie müssen einen Schlüssel und einen Wert haben. Ihre gewünschte Ausgabe beschreibt keinen Schlüssel für jede innere dict, so dass eine dict nicht die gewünschte Datenstruktur ist. Was möchten Sie wahrscheinlich ist genau das, was Sie Werke herausgefunden:

loc = [ 
    {'id' : 123 , 'status' : 'available' }, 
    {'id' : 456 , 'status' : 'unavailable'} 
] 

Dies ist ein list. A list ist die Go-to-Datenstruktur zum Halten einer Sequenz von Elementen. Sie können über sie iterieren:

for i in loc: 
    print(i) 

oder Zugangselemente davon über Index:

loc[2] 

Dies ist wahrscheinlich das, was Sie wollen. Es gibt mehr, was Sie damit tun können, wie slice, aber ich werde hier nicht auf alles eingehen.

Die Funktion update, die Sie in Ihrem Beispielcode aufrufen, wird verwendet, um jeden Schlüssel in der Eingabe dict aufzunehmen und entweder das Schlüssel/Wert-Paar hinzuzufügen oder den Wert für einen vorhandenen Schlüssel zu aktualisieren. Sie könnten sich das als "Verschmelzen" des Arguments dict in das vor dem Punkt vorstellen. Deshalb überschrieb es jedes Mal alle Werte; so soll es funktionieren. Pythons Dokumentation ist ziemlich gut; Sie wollen sich daran gewöhnen, es immer dann zu konsultieren, wenn sich etwas nicht so verhält, wie Sie es erwarten.

+0

Danke jpmc26 für wichtige Informationen – user280960

2

Wenn id einzigartig ist, scheint es wahrscheinlicher, dass das, was Sie wirklich wollen, ist nur ein dict Mapping id-status.

for res in result: 
    loc[res.id] = res.status 

Wenn Sie iterieren loc.viewitems() (in PY3, nur loc.items()), erhalten Sie tuple s das Paar jedes id mit seiner status; Python verwendet tuple s als eine Art von "anonymen Lightweight Objects", also funktioniert es ziemlich ähnlich wie die set von dict s, die Sie zu bauen versuchten. Gebrauchte Auf diese Weise können Sie effizient Werte von id nachschlagen (loc[someid] erhalten Sie die zugehörigen status, wenn die id existiert oder erhöhen KeyError), während noch in der Lage effizient ihnen zu wechseln:

for ID, status in loc.viewitems(): 
    # do stuff with ID and status 

A list von dict s macht Nachschlag eine O(n) Aufgabe (wo die Ebene dict grob O(1) Lookup) und macht Iteration ein wenig hässlich, die Sie auffordert, operator.itemgetter zu verwenden, um eine ähnliche Schleife zum Auspacken, oder die manuell Nachschlag der beiden id und status für jeden Artikel zu schreiben Das ist hässlich zu s ay das Geringste. Es ist auch viel weniger effizient Speicher-weise; jeder zwei Artikel dict zahlt ziemlich erheblichen Speicheraufwand im Vergleich zu einem einzigen größeren dict.

Eine andere zu berücksichtigende Option, wenn Sie wirklich möchten, dass sich dieses Verhalten mehr wie JS-Objekte verhält, ist collections.namedtuple. Es ist eine Art dict wie; Sie Zugriff auf Attribute mit Punktsyntax, keine Schlüssel mit Klammer-Syntax, aber es ist viel mehr Speicher effizient, und es ist unveränderlich, so dass es in einem set gehen kann:

from collections import namedtuple 

Record = namedtuple('Record', 'id status') 

loc = {Record(res.id, res.status) for res in result} 

Sie können dann die namedtuple wie ein normales tuple verwenden (so for ID, status in loc: Werke) oder Named Verwendung Attribut Zugriff statt:

for record in loc: 
    print(record.id, record.status) 
+0

Danke ShadowRanger – user280960

0

Sie ein Wörterbuch durch Hinzufügen eines neuen Eintrag oder ein Schlüssel-Wert-Paar, Modifizieren eines bestehenden Eintrags oder Löschen eines bestehenden Eintrags aktualisieren können, wie weiter unten in das einfache Beispiel

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'} 

dict['Age'] = 8; # update existing entry 
dict['School'] = "DPS School"; # Add new entry 


print "dict['Age']: ", dict['Age'] 
print "dict['School']: ", dict['School'] 

Quelle: iodocs