2009-12-17 10 views
100

Ho una lista di Latitudes e una di Longitudes e ho bisogno di scorrere le coppie di latitudine e longitudine.C'è un modo migliore per scorrere su due liste, ottenendo un elemento da ogni lista per ogni iterazione?

è meglio:

  • A. Si supponga che le liste sono di uguale lunghezza:

    for i in range(len(Latitudes): 
        Lat,Long=(Latitudes[i],Longitudes[i]) 
    
  • B. Oppure:

    for Lat,Long in [(x,y) for x in Latitudes for y in Longitudes]: 
    

(Si noti che B non è corretto. Questo mi dà tutte le coppie, equi valent to itertools.product())

Qualche idea sui relativi meriti di ciascuno, o che è più pitonico?

risposta

197

Questo è il più divinatorio come si può ottenere:

for lat, long in zip(Latitudes, Longitudes): 
    print lat, long 
+24

In Python 2.x si può prendere in considerazione itertools.izip (zip fa la stessa cosa in Python 3.x). –

+2

@NicholasRiley: cura di dire perché? – User

+5

Utilizza meno memoria e potrebbe essere più veloce; crea un iteratore piuttosto che una lista intermedia. –

6

Iterare elementi di due liste contemporaneamente è noto come zippare, e Python fornisce un costruito in funzione per esso, che è documentata here.

>>> x = [1, 2, 3] 
>>> y = [4, 5, 6] 
>>> zipped = zip(x, y) 
>>> zipped 
[(1, 4), (2, 5), (3, 6)] 
>>> x2, y2 = zip(*zipped) 
>>> x == list(x2) and y == list(y2) 
True 

[Esempio è tratto da pydocs]

Nel tuo caso, sarà semplicemente:

for (lat, lon) in zip(latitudes, longitudes): 
    ... process lat and lon 
5
for Lat,Long in zip(Latitudes, Longitudes): 
20

bello vedere un sacco di amore per zip nelle risposte qui.

Tuttavia, se si utilizza una versione python prima della 3.0, il modulo itertools nella libreria standard contiene una funzione izip che restituisce un iterabile, che è più appropriato in questo caso (specialmente se l'elenco di/long è abbastanza lungo).

In python 3 e successive zip si comporta come izip.

39

Un altro modo per farlo sarebbe quello di utilizzare map.

>>> a 
[1, 2, 3] 
>>> b 
[4, 5, 6] 
>>> for i,j in map(None,a,b): 
    ... print i,j 
    ... 
1 4 
2 5 
3 6 

Una differenza nel usando la mappa rispetto a zip è, con zip la lunghezza della nuova lista è
uguale alla lunghezza della lista più corta. Per esempio:

>>> a 
[1, 2, 3, 9] 
>>> b 
[4, 5, 6] 
>>> for i,j in zip(a,b): 
    ... print i,j 
    ... 
1 4 
2 5 
3 6 

Utilizzando mappa su stessi dati:

>>> for i,j in map(None,a,b): 
    ... print i,j 
    ... 

    1 4 
    2 5 
    3 6 
    9 None 
+0

è possibile farlo come: 14,15,16 ?? – BomberMan

15

nel caso in cui latitudine e longitudine liste sono grandi e pigramente caricato:

from itertools import izip 
for lat, lon in izip(latitudes, longitudes): 
    process(lat, lon) 

o se si vuole evitare the for-loop

from itertools import izip, imap 
out = imap(process, izip(latitudes, longitudes)) 
3

Questo post mi ha aiutato con zip(). So di avere qualche anno di ritardo, ma voglio comunque contribuire. Questo è in Python 3.

Nota: in python 2.x, zip() restituisce un elenco di tuple; in Python 3.x, zip() restituisce un iteratore. itertools.izip() in Python 2.x == zip() in python 3.x

Poiché sembra che si sta costruendo una lista di tuple, il seguente codice è il modo più divinatorio di provare a realizzare ciò che si sta facendo.

>>> lat = [1, 2, 3] 
>>> long = [4, 5, 6] 
>>> tuple_list = list(zip(lat, long)) 
>>> tuple_list 
[(1, 4), (2, 5), (3, 6)] 

Oppure, in alternativa, è possibile utilizzare list comprehensions (o list comps) se avete bisogno di operazioni più complesse. Le comprensioni delle liste funzionano anche alla velocità di map(), danno o richiedono pochi nanosecondi e stanno diventando la nuova norma per ciò che è considerato Pythonic rispetto a map().

>>> lat = [1, 2, 3] 
>>> long = [4, 5, 6] 
>>> tuple_list = [(x,y) for x,y in zip(lat, long)] 
>>> tuple_list 
[(1, 4), (2, 5), (3, 6)] 
>>> added_tuples = [x+y for x,y in zip(lat, long)] 
>>> added_tuples 
[5, 7, 9] 
Problemi correlati