2013-01-21 16 views
10

Ho due liste come questa:Dividere una lista con un altro elenco

monkey = ['2\n', '4\n', '10\n'] 

banana = ['18\n', '16\n', '120\n'] 

Quello che voglio fare con questi due elenco è fare una terza lista, chiamiamolo bananaSplit.

devo spogliare ' \n', lasciando solo i valori e poi fare una formula che si divide in:

bananasplit[0] = banana[0]/monkey[0] 

bananasplit[1] = banana[1]/monkey[1] ecc

ho sperimentato con ciclo while, ma non riesco a farlo bene. Ecco cosa ho fatto:

bananasplit = 3*[None] 

i = 0 

while i <= 2: 

    [int(i) for i in monkey] 

    [int(i) for i in banana] 

    bananasplit[i] = banana[i]/monkey[i] 

    i += 1 

Come demolire questo piccolo problema?

risposta

15

Di seguito lo farà:

>>> bananasplit = [int(b)/int(m) for b,m in zip(banana, monkey)] 
>>> print(bananasplit) 
[9, 4, 12] 

quanto riguarda il tuo codice originale va, il problema principale è che i seguenti sono effettivamente no-ops:

[int(i) for i in monkey] 
[int(i) for i in banana] 

per trasformarli in qualcosa di utile, dovresti assegnare i risultati da qualche parte, ad esempio:

monkey = [int(i) for i in monkey] 
banana = [int(i) for i in banana] 

Infine, è un mosto osservando che, a seconda della versione di Python, la divisione di un intero con un altro utilizzando / interrompe il risultato o restituisce un risultato a virgola mobile. Vedi In Python 2, what is the difference between '/' and '//' when used for division?

+1

L'esempio è bello e pertinente, ma una nota: non è necessario 'strip()', poiché 'int()' non gli interessa. –

+0

@ThorstenKranz: Grazie, non lo sapevo. Ho aggiornato la risposta. – NPE

+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

Prova qualcosa del genere.

bananasplit = [x/y for x, y in zip(map(int, banana), map(int, monkey))] 

Se si desidera che il risultato float (in python 2.x), è possibile modificare le int s di essere float, o from __future__ import division

+0

+1 per essere così succinti, -1 per essere così sintetici e senza commenti. Pensi che il poster sarà in grado di seguire? – 9000

+0

@ 9000 All'ora in cui avevo postato, poi ritorna per aggiungere dettagli La risposta di NPE già copriva tutto - non sentivo il bisogno di ripetere tutto. Se qualcuno manca questa risposta lo lascerò come esercizio da capire: P – DanielB

+1

'map'ping su' int' prima che 'zip' manchi metà del potere espressivo della comprensione della lista. Se vuoi fare le cose in questo modo, potresti anche andare fuori con 'map (int .__ div__, map (int, banana), map (int, monkey))' o qualcosa del genere. Almeno allora stai sfruttando lo zip implicito incorporato in 'map'. : P O, del resto, 'mappa (lambda b, m: int (b)/int (m), banana, scimmia)'. –

1

Lista di iterazione e la funzione di mappa che arriva molto rapidamente.

>>> monkey = ['2\n', '4\n', '10\n'] 

>>> banana = ['18\n', '16\n', '120\n'] 

>>> monkey = [ float(m.strip()) for m in monkey] 

>>> banana = [ float(m.strip()) for m in banana] 

>>> def div(a,b): 

...  return a/b 

... 

>>> map(div, banana, monkey) 

[9.0, 4.0, 12.0] 

>>> 
0

Un elenco di comprensione, come [an_expression for some_variable in some_sequence] restituisce una nuova lista. Il tuo esempio lascia solo questi risultati.

# remove trailing whitespace and convert strings to numbers 
monkey_numbers = [int(item.strip()) for item in monkey] 
banana_numbers = [int(item.strip()) for item in banana] 

# a traditional loop 
bananasplit = [] # an empty list 
for i in range(len(banana_numbers)): 
    # make bananasplit longer on each iteration 
    bananasplit.append(banana_numbers[i]/monkey_numbers[i]) 

Quindi, è possibile utilizzare una comprensione di lista invece di un ciclo poiché la tua espressione è così semplice. Avrai bisogno di zip function che prende due liste e crea una lista di coppie.

# divide in one statement 
bananasplit = [ 
    banana_portion/monkey_bunch 
    for (banana_portion, monkey_bunch) in 
    zip(banana_numbers, monkey_numbers) 
] 

Naturalmente, si è liberi di utilizzare identificatori più brevi; Ho usato nomi lunghi per rendere i loro ruoli più facili da capire.

Problemi correlati