2010-09-16 12 views
5

Diciamo che ho due set di dati. Ho un conteggio settimana per settimana di utenti che hanno provato il mio servizio.Come suddividere i membri di una lista in base ai membri corrispondenti di un'altra lista in Python?

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

E ho un conteggio settimana per settimana degli utenti di prova che si sono registrati.

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

posso farlo abbastanza velocemente in questo modo:

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

Riuscite a pensare a un modo più elegante?

Bonus: il risultato di questo è un elenco di [0, 0, 1, 0, 1, 0] , non un elenco di galleggianti. Qual è il modo più semplice per ottenere una lista di galleggianti?

+1

All'inizio stavo per rispondere con 'zipWith', ma poi ho capito che non esiste in python. Che tristezza ... – Daenyth

risposta

15

Uso zip:

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

Il modo più elegante per ottenere carri è quello di effettuare l'aggiornamento a Python 3.x.

Se è necessario utilizzare Python 2.x allora si potrebbe scrivere questo:

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

In alternativa si potrebbe aggiungere questo all'inizio del file:

from __future__ import division 

Ma notare che questa volontà influire sul comportamento della divisione in tutto il programma, quindi è necessario controllare attentamente per vedere se ci sono posti in cui si desidera la divisione di interi e in tal caso scrivere // anziché /.

+0

Ho 'q = [[7,2,3], [4,5,6]]' e 'r = [[6,1,2], [3,4,5]] '. Devo dividere gli elementi corrispondenti. 'B = [[float (j)/float (i) per j in q] per i in r]'. Tuttavia, continuo a ricevere un errore: TypeError: float() argomento deve essere una stringa o un numero. Ho importato la divisione dal futuro. Eventuali suggerimenti? – Biotechgeek

2

Come su

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 ovviamente. Mark Byers 'è una risposta molto migliore e lo altererei se avessi abbastanza rep – Day

+1

+1 per lo sforzo :) – Skilldrick

+0

@Skilldrick Heh grazie. Ora posso revocare la risposta di Mark;) – Day

1

Se vi capita di essere utilizzando numpy, è possibile utilizzare le seguenti idee:

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

o, utilizzando la trasmissione:

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

Senza usare zip e float:

[1.0*conversions[n]/trials[n] for n in xrange(len(trials))] 
Problemi correlati