2012-08-07 5 views
8

Ich habe zwei Wörterbücher mit den gleichen Schlüsseln und ich möchte Division auf die Werte zu aktualisieren oder erstellen Sie ein neues Wörterbuch, halten die Schlüssel intakt, mit dem Quotienten als den neuen Wert für jeder der Schlüssel.Teilen Sie die Werte von zwei Wörterbüchern in Python

d1 = { 'a':12 , 'b':10 , 'c':2 } 
d2 = { 'a':0 , 'c':2 , 'b':5} 
d3 = d2/d1 

d3 = { 'a':0 , 'b':0.5 , 'c':1 } 

Abgesehen durch den Schlüssel aus Iterieren, Wert-Paaren und geordnete Listen der Werte zu schaffen, dann teilen, bin ich nicht sicher, wie dies zu tun. Ich habe auf eine elegantere Lösung gehofft.

Antwort

13

Mit viewkeys (python2.7):

{k: float(d2[k])/d1[k] for k in d1.viewkeys() & d2} 

Same in Python 3 (wo wir den float() Anruf ganz fallen lassen kann):

{k: d2[k]/d1[k] for k in d1.keys() & d2} 

Ja, ich bin mit einem Schlüssel Kreuzung hier ; wenn Sie absolut sicher sind, Ihre Schlüssel in beide gleich sind, verwenden Sie einfach d2:

{k: float(d2[k])/d1[k] for k in d2} 

und vollständig zu sein, in Python 2.6 und bevor Sie einen dict() Konstruktor mit einem Generator Ausdruck verwenden müssen, um das zu erreichen, gleich:

dict((k, float(d2[k])/d1[k]) for k in d2) 

das eine Folge von Schlüsselwert-Tupel erzeugt.

+0

Schlüssel Schnittpunkt ist nicht notwendig, OP besagt, dass die 2 dicts die gleichen Schlüssel haben – jamylak

+0

@jamylak: besser sicher als Nachsicht? :-P –

+0

@MartijinPieters du bist richtig! – jamylak

5

Diese für alle Pythons funktioniert, würde ich jedoch die Lösung von @MartijnPieters empfehlen, wenn haben Py 2.7+

>>> d1 = { 'a':12 , 'b':10 , 'c':2 } 
>>> d2 = { 'a':0 , 'c':2 , 'b':5} 
>>> d3 = dict((k, float(d2[k])/d1[k]) for k in d2) 
>>> d3 
{'a': 0.0, 'c': 1.0, 'b': 0.5} 
4
d1 = { 'a':12 , 'b':10 , 'c':2 } 
d2 = { 'a':0 , 'c':2 , 'b':5} 
d3={x:float(d2[x])/d1[x] for x in d1} 
print d3 

Ausgang:

{'a': 0.0, 'c': 1.0, 'b': 0.5} 
+0

+1 Ich wusste nie, dass es auch für Diktate funktioniert! – SuperSaiyan

+2

@Thrustmaster: es heißt ein Diktatverständnis; eingeführt in Python 2.7: [PEP 274] (http://www.python.org/dev/peps/pep-0274/). –

+0

@MartijnPieters: Erstaunlich! Danke :) – SuperSaiyan

1

in 3.2 Sie die verwenden. keys() -Methode und die .get-Taste (Schlüssel).

+0

'.get (Schlüssel)' gibt keine zurück, wenn der Schlüssel nicht definiert ist. Obwohl es immer so sein wird, wenn Sie über '.keys()' loopen, bedeutet das, dass '.get (key)' langsamer ist als nur einfacher Zugriff auf Elemente ('d1 [key]'). –

+0

Das funktioniert auch in Python 2 – jamylak