web-dev-qa-db-fra.com

Existe-t-il une meilleure façon de parcourir deux listes, en obtenant un élément de chaque liste pour chaque itération?

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?

129
chongman

Ceci est aussi Pythonic que vous pouvez obtenir:

for lat, long in Zip(Latitudes, Longitudes):
    print lat, long
246
Roberto Bonvallet

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
47
sateesh

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.

21
Wogan

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))
15
JudoWill

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
6
notnoop
for Lat,Long in Zip(Latitudes, Longitudes):
5
John La Rooy

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]
3
dysfunctional