2012-03-22 4 views
11

C'è un modo intelligente per scrivere una lista di comprensione su più di una lista?Valori Python di più elenchi in un elenco di comprensione

So che potrei usare un elenco di intervalli separato come indice ma in questo modo devo conoscere la lunghezza (o ottenerla separatamente con una chiamata di funzione len()).

>>> a = range(10) 
>>> b = range(10, 0, -1) 
>>> [(a[x],b[x]) for x in range(10)] 
[(0, 10), (1, 9), (2, 8), (3, 7), (4, 6), (5, 5), (6, 4), (7, 3), (8, 2), (9, 1)] 

Mi piacerebbe avere qualcosa di simile:

>>> [(a,b) for a in range(10) and b in range(10, 0, -1)] 
[(0, 10), (1, 9), (2, 8), (3, 7), (4, 6), (5, 5), (6, 4), (7, 3), (8, 2), (9, 1)] 

Come ti scrivere la lista di comprensione? C'è un modo per farlo con itertools?

L'elenco di intervalli corrisponde a qualsiasi elenco e non voglio necessariamente ottenere una tupla. potrebbe anche esserci una funzione che accetta a e b come parametri. Quindi zip non è quello che voglio.

AGGIORNAMENTO: Con "Così zip non è quello che voglio." Volevo dire che io non voglio zip(range(10), range(10, 0, -1))

+0

Duplicato di [9184497] (http://stackoverflow.com/questions/9184497/python-list-comprehension-function-with- argomenti-in-due-liste)? – quazgar

risposta

20

Il vostro esempio è solo:

zip(range(10), range(10, 0, -1)) 

Più in generale, è possibile partecipare a qualsiasi insieme di iterables usando zip:

[func(a, d, ...) for a, b, ..., n in zip(iterable1, iterable2, ..., iterableN)] 
+1

La seconda soluzione è ciò che voglio. Molte grazie. – dominik

+0

Si potrebbe prendere in considerazione ['itertools.izip'] (http://docs.python.org/library/itertools.html#itertools.izip) poiché è meglio in sequenze di grandi dimensioni. Stessa idea, solo uno strumento leggermente diverso. –

+0

Penso che potreste aver intenzione di scrivere '[func (a, b, ...) per a, b, ..., n in zip (iterabile1, iterabile2, ..., iterabileN)]' –

1

Se si desidera applicare una funzione per diverse sequenze, è necessario o map o itertools.imap:

map(lambda *x: sum(x), range(10), range(10, 0, -1), range(0,20, 2)) 

Non è necessario eseguire il zip se non si preferisce eseguire la mappatura in un elenco comprensivo

+0

Questo non è cosa vuole. Guarda il suo secondo esempio: vuole "zip". E non hai mai bisogno di 'map', un'espressione di lista/generatore può fare tutto ciò che può e altro. – agf

+1

@agf "potrebbe esserci anche una funzione che accetta a e b come parametri, quindi zip non è quello che voglio." Si potrebbe obiettare che non è mai necessario anche zip, perché la mappa è disponibile. – Marcin

+0

Ha scritto che prima ho aggiunto il mio secondo esempio, mostrando come usare una funzione con 'zip'. Leggi il suo commento sulla mia risposta scritta dopo averlo aggiunto. Intendeva che non voleva _just_ 'zip', non che non volesse affatto" zip ". – agf