2017-12-12 1 views
2

Ich habe folgendes:DefaultDict verhält sich in beiden Fällen

{'reportid1':{'name':'sriram sathyan','amount':3000}, .....} 

Ich versuchte, den followig Code:

names = defaultdict(dict) 
for item in a: 
    report_id = item['_id']['reportId'] 
    amount = item['amount'] 
    names[report_id] = {'name': item['_id'].get('name','')} 
    if amount != 0: 
     names[report_id].update({'amount': amount}) 
print(dict(names)) 

Ausgänge:

a = [{ "_id" : { "reportId" : "5a27cda63fff647c33a14b31" }, "amount" : 3000 }, 
    { "_id" : { "reportId" : "5a27cda63fff647c33a14b31", "name" : "sriram sathyan" }, "amount" : 0 }, 
    { "_id" : { "reportId" : "5a27cf173f978655f2efbee7" }, "amount" : 1200 }, 
    { "_id" : { "reportId" : "5a27cf173f978655f2efbee7", "name" : "karthik subbaraj" }, "amount" : 0 } 
    ] 

ich die folgende Struktur wollte

{'5a27cda63fff647c33a14b31': {'name': 'sriram sathyan'}, '5a27cf173f978655f2efbee7': {'name': 'karthik subbaraj'}} 

(nicht das, was ich wollte)

Ich änderte dann den obigen Code zu:

for item in a: 
    report_id = item['_id']['reportId'] 
    amount = item['amount'] 
    if amount != 0: 
     names[report_id] = {'amount': amount} 
    names[report_id].update({'name': item['_id'].get('name','')}) 
print(dict(names)) 

XLR-:

{'5a27cda63fff647c33a14b31': {'amount': 3000, 'name': 'sriram sathyan'}, '5a27cf173f978655f2efbee7': {'amount': 1200, 'name': 'karthik subbaraj'}} 

(was ich wollte !!!!!)

So ist die Frage => Wie könnte die Platzierung der if-Anweisung eine solche Änderung verursachen? Oder ist es etwas, das ich hier vermisse?

Antwort

1

Das Problem ist, dass im ersten Fall, dass Sie überwiegende names[report_id] auf dieser Linie sind:

names[report_id] = {'name': item['_id'].get('name','')} 

Lassen Sie sich die 5a27cda63fff647c33a14b31 Artikeln im names Wörterbuch folgen:

  1. Auf der ersten Iteration der Schleife setzen Sie den Wert names[report_id]:

    {'5a27cda63fff647c33a14b31': {'name': ''}} 
    
  2. Dann wird, da der Betrag 3000 ist, wird das Wörterbuch aktualisiert:

    {'5a27cda63fff647c33a14b31': {'name': '', 'amount': 3000}} 
    
  3. Dann wird auf der zweiten Iteration der Schleife wird das Wörterbuch vollständig zu verlieren, die amount Wert insgesamt überschrieben führende:

    {'5a27cda63fff647c33a14b31': {'name': 'sriram sathyan'}} 
    

Verwenden der Debugger die Ausführung Zeile für Zeile, beobachten, wie die names Wörterbuch Änderungen zu folgen.

+0

Danke. Ich schätze die Zeit, die ich brauche, um die Antwort auf diese Weise zu bearbeiten und zu formatieren :) – Adarsh

2

das Problem ist, dass Sie identische Schlüssel haben, eine mit amount gleich Null in den Daten und ein mit amountnicht Null.

in der ersten Schleife wird der Eintrag mit einem Nicht-Null amount erstellt wird, dann durch den Eintrag mit Null amount

beide Codes So überschrieben überschrieben werden einige Einträge, aber der erste Code überschreibt die Einträge, die Sie wollen zu behalten, während der zweite (derjenige, der funktioniert) überschreibt die Einträge mit Null amount.

+0

wow. Vielen Dank :) – Adarsh