2010-09-16 23 views
5

Digamos que tengo dos conjuntos de datos. Tengo una cuenta semanal de usuarios que probaron mi servicio.¿Cómo se dividen los miembros de una lista por los miembros correspondientes de otra lista en Python?

trials = [2,2,2,8,8,4] 

Y tengo una semana por semana de usuarios de prueba que se registraron.

conversions = [1,0,2,4,8,3] 

puedo hacerlo muy rápidamente de esta manera:

conversion_rate = [] 
for n in range(len(trials)): 
    conversion_rate.append(conversions[n]/trials[n]) 

¿Se puede pensar en una forma más elegante?

Bonificación: El resultado de esto es una lista de ints [0, 0, 1, 0, 1, 0] , no una lista de flotadores. ¿Cuál es la forma más fácil de obtener una lista de carrozas?

+1

Al principio iba a responder con 'zipWith', pero luego me di cuenta de que no existe en python. Qué triste ... – Daenyth

Respuesta

15

Uso postal:

[c/t for c,t in zip(conversions, trials)] 

La forma más elegante de conseguir los flotadores es actualizar a Python 3.x

Si tiene que usar Python 2.x entonces se podría escribir lo siguiente:

>>> [float(c)/t for c,t in zip(conversions, trials)] 
[0.5, 0.0, 1.0, 0.5, 1.0, 0.75] 

Alternativamente, usted podría añadir esto al comienzo de su archivo:

from __future__ import division 

Pero tenga en cuenta que esta voluntad afecte el comportamiento de la división en todas partes de su programa, por lo que debe verificar cuidadosamente si hay algún lugar donde desee una división entera y, en caso afirmativo, escriba // en lugar de /.

+0

Tengo 'q = [[7,2,3], [4,5,6]]' y 'r = [[6,1,2], [3,4,5]] '. Necesito dividir los elementos correspondientes. 'B = [[float (j)/float (i) para j en q] para i in r]'. Sin embargo, sigo obteniendo un error: el argumento TypeError: float() debe ser una cadena o un número. Importé la división del futuro. ¿Alguna sugerencia? – Biotechgeek

2

¿Qué tal

trials = [2,2,2,8,8,4] 
conversions = [1,0,2,4,8,3] 
conversion_rate = [conversion/trials[n] for n, conversion in enumerate(conversions)] 
+0

zip por supuesto. Mark Byers es una respuesta mucho mejor y la hubiera votado si tuviera suficientes representantes – Day

+1

+1 por esfuerzo :) – Skilldrick

+0

@Skilldrick Heh gracias. Ahora puedo votar la respuesta de Mark;) – Day

1

Si sucede utilizar numpy, puede utilizar las siguientes ideas:

import numpy as np 
conversion_rate = np.divide(trials, conversions) 

o, utilizando la radiodifusión:

import numpy as np 
trials = np.array([2, 2, 2, 8, 8, 4]) 
conversions = np.array([1, 0, 2, 4, 8, 3]) 
conversion_rate = 1.0 * trials/conversions 
2

Sin utilizar postal y flotar:

[1.0*conversions[n]/trials[n] for n in xrange(len(trials))] 
Cuestiones relacionadas