2014-12-17 10 views
5

Bewerben habe ich Wörterbuch, das wie folgt aussehenFunktion auf alle Werte von Wörterbuch

d= {(1, 8): 94.825000000000003, (2, 8): 4.333} 

Ich versuche, eine Funktion anzuwenden alle Werte runden.

Ich möchte das Wörterbuch nicht neu erstellen.

newD= {} 
for x,y in d.iteritems(): 
    newD+= {x:round(y)} 

Gibt es eine pythonic-Wege round Funktion auf alle Werte anzuwenden?

+1

Ihr Beispiel nicht wirklich funktionieren, auch scheint es, wie Sie das Wörterbuch sind neu zu erstellen, indem 'newD' korrigiere mich wenn ich falsch liege – jamylak

+0

Es ist kein Duplikat. Das ist anders – user3378649

Antwort

5

Diese etwas gewunden ist, aber du hast für einen ‚pythonic-Weg‘ fragen;)

newD = {k:round(v) for k, v in d.items()} 

jedoch dieses Wörterbuch Verständnis wird nur auf 2.7+ arbeiten. Wenn eine ältere Version von Python verwenden, versuchen Sie diesen mehr gewundenen Weg:

newD = dict(zip(d.keys(), [round(v) for v in d.values()])) 

Lassen Sie mich das ein wenig auspacken:

  • Wir beginnen mit dem neuen Wörterbuch Neuzuweisung (d) Objekt zurück zu einem neues Wörterbuch wie gewünscht (obwohl man leicht zu dem gleichen Namen zuweisen könnte)
  • der äußere dict() sorgt für das Endergebnis ein Dictionary-Objekt ist
  • zip() eine Liste von Tupeln zurückgibt, wo th e i-ten Tupel enthält das i-te Element von jedem der Argument-Sequenzen
  • Die zu zip() angegebenen Reihenfolge ersten Arguments ist zu zip() angesichts der Wörterbuchschlüssel (d.keys())
  • Die zweite Argument Sequenz ist die gerundeten Werte nach dem Liste Verständnis
  • die Liste Verständnis rundet jeden Wert in den Wörterbuchwerten und gibt eine Liste der gerundeten Werte
+1

Oder Sie könnten einfach '' d = {k: round (v) für k, v in d.items()} '' schreiben, aber die Frage explizit angegeben * "Ich möchte das Wörterbuch nicht neu erstellen." * – fjarri

+0

@Bogdan guter Punkt, aktualisiert. Vielen Dank! – Dan

+0

elegante Lösung @Dan – user3378649

5

Man könnte so etwas wie dies versuchen:

for k, v in d.iteritems(): 
    d[k] = round(v) 

Es wird eine direkte Abrundung aller Elemente im Wörterbuch tun. In diesem speziellen Beispiel wird es perfekt funktionieren, jedoch vorsichtig sein - alle normalen Vorbehalte der Verwendung von the round function gelten.

+0

Sie runden eines der Wörterbuchschlüssel Tupel Mitglieder, wie kann dies die Antwort sein? – jamylak

+0

@jamylak Es tut mir leid, ich verstehe deine Frage nicht? Ich iteriere durch jeden Schlüssel, jedes Wertpaar im Wörterbuch, berechne einen neuen Wert und ersetze das alte im Wörterbuch. –

+0

Nein, du bist nicht, du wiederholst nur die Schlüssel. Versuchen Sie 'print k, v' in Ihrer Schleife – jamylak

Verwandte Themen