J'ai une liste de latitudes et une de longitudes et j'ai besoin de parcourir les couples latitude et longitude.
Est-il préférable de:
A. Supposons que les listes ont des longueurs égales:
for i in range(len(Latitudes):
Lat,Long=(Latitudes[i],Longitudes[i])
B. Ou:
for Lat,Long in [(x,y) for x in Latitudes for y in Longitudes]:
(Notez que B est incorrect. Cela me donne toutes les paires, équivalent à itertools.product()
)
Avez-vous des idées sur les mérites relatifs de chacun, ou lequel est le plus pythonique?
Ceci est aussi Pythonic que vous pouvez obtenir:
for lat, long in Zip(Latitudes, Longitudes):
print lat, long
Une autre façon de faire serait d'utiliser 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
Une différence dans l'utilisation de la carte par rapport à Zip est, avec Zip la longueur de la nouvelle liste est
identique à la longueur de la liste la plus courte. Par exemple:
>>> 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
Utiliser la carte sur les mêmes données:
>>> for i,j in map(None,a,b):
... print i,j
...
1 4
2 5
3 6
9 None
C'est bien de voir beaucoup d'amour pour Zip
dans les réponses ici.
Toutefois, il convient de noter que si vous utilisez une version de python antérieure à 3.0, le module itertools
de la bibliothèque standard contient une fonction izip
qui renvoie une valeur itérable. , ce qui est plus approprié dans ce cas (surtout si votre liste de latt/longs est assez longue).
Dans python 3 et versions ultérieures, Zip
se comporte comme izip
.
si vos listes de latitude et de longitude sont volumineuses et chargées paresseusement:
from itertools import izip
for lat, lon in izip(latitudes, longitudes):
process(lat, lon)
ou si vous voulez éviter la boucle for
from itertools import izip, imap
out = imap(process, izip(latitudes, longitudes))
Itérer à travers des éléments de deux listes simultanément est appelé zipping, et python fournit une fonction intégrée, documentée ici .
>>> 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
[Exemple tiré de pydocs]
Dans votre cas, ce sera simplement:
for (lat, lon) in Zip(latitudes, longitudes):
... process lat and lon
for Lat,Long in Zip(Latitudes, Longitudes):
Cet article m'a aidé avec Zip()
. Je sais que je suis en retard de quelques années, mais je veux toujours contribuer. Ceci est dans Python 3.
Remarque: in python 2.x, Zip()
renvoie une liste de nuplets; in Python 3.x, Zip()
retourne un itérateur. itertools.izip()
in python 2.x == Zip()
in python 3.x
Comme il semble que vous construisiez une liste de n-uplets, le code suivant est le moyen le plus pythonique d’essayer de réaliser ce que vous faites.
>>> lat = [1, 2, 3]
>>> long = [4, 5, 6]
>>> Tuple_list = list(Zip(lat, long))
>>> Tuple_list
[(1, 4), (2, 5), (3, 6)]
Ou bien, vous pouvez également utiliser list comprehensions
(Ou list comps
) Si vous avez besoin d'opérations plus compliquées. Les compréhensions de liste fonctionnent aussi vite que map()
, donnent ou prennent quelques nanosecondes et deviennent la nouvelle norme pour ce qui est considéré comme Pythonic par rapport à 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]