2012-08-07 40 views
8

Tengo dos diccionarios con las mismas claves y me gustaría hacer una división en los valores para actualizar o crear un nuevo diccionario, manteniendo las claves intactas, con el cociente como el nuevo valor para cada una de las llavesDivida los valores de dos diccionarios en 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 } 

Aparte de iteración a través de la llave, pares de valores y la creación de listas ordenadas de los valores, a continuación, dividir, no estoy seguro de cómo hacer esto. Esperaba una solución más elegante.

Respuesta

13

Uso viewkeys (python2.7):

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

mismo en Python 3 (donde podemos colgar la llamada float() en total):

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

Sí, estoy usando una intersección clave aquí ; si está absolutamente seguro de que sus teclas son las mismas en ambos, sólo tiene que utilizar d2:

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

Y para ser completa, En Python 2.6 y antes de que usted tiene que utilizar un constructor dict() con una expresión generadora de lograr el mismo:

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

que genera una secuencia de tuplas clave-valor.

+0

intersección de clave no es necesario, OP indica que los 2 dicts tienen las mismas claves – jamylak

+0

@jamylak: ¿es mejor evitar que perdonar? :-P –

+0

@MartijinPieters ¡estás en lo correcto! – jamylak

5

Esto funciona para todos los pitones, me gustaría recomendar sin embargo la solución por @MartijnPieters si tenga 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 

de salida:

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

+1 ¡Nunca supe que funciona también para los dicts! – SuperSaiyan

+2

@Thrustmaster: se llama comprensión dict; introducido en Python 2.7: [PEP 274] (http://www.python.org/dev/peps/pep-0274/). –

+0

@MartijnPieters: ¡Increíble! Gracias :) – SuperSaiyan

Cuestiones relacionadas