web-dev-qa-db-fra.com

Comment puis-je parcourir une liste par deux?

Duplicate possible:
Quel est le moyen le plus “pythonique” d’itérer une liste en morceaux?

Je souhaite parcourir la liste Python et traiter 2 éléments à la fois. Quelque chose comme ça dans une autre langue:

for(int i = 0; i < list.length(); i+=2)
{
   // do something with list[i] and list[i + 1]
}

Quel est le meilleur moyen d'y parvenir?

221
froadie

Vous pouvez utiliser pour dans la plage avec une taille de pas de 2:

Python 2

for i in xrange(0,10,2):
  print(i)

Python

for i in range(0,10,2):
  print(i)

Note: Utilisez xrange dans Python 2 au lieu de range car il est plus efficace car il génère un objet itérable, et non la liste entière.

331
Brian R. Bondy

Vous pouvez également utiliser cette syntaxe (L[start:stop:step]):

mylist = [1,2,3,4,5,6,7,8,9,10]
for i in mylist[::2]:
    print i,
# prints 1 3 5 7 9

for i in mylist[1::2]:
    print i,
# prints 2 4 6 8 10

Où le premier chiffre est l'index de départ (par défaut, le début de la liste ou 0), le second est l'indice de fin de tranche (par défaut, la fin de la liste) et le troisième chiffre est le décalage ou l'étape.

79
jathanism

Le plus simple à mon avis est juste ceci:

it = iter([1,2,3,4,5,6])
for x, y in Zip(it, it):
    print x, y

Aucune importation supplémentaire ou quoi que ce soit. Et très élégant, à mon avis.

43
carl

Si vous utilisez Python 2.6 ou plus récent, vous pouvez utiliser le groupeur recette à partir de itertools module:

from itertools import izip_longest

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

Appelle comme ça:

for item1, item2 in grouper(2, l):
    # Do something with item1 and item2

Notez que dans Python 3.x, vous devez utiliser Zip_longest au lieu de izip_longest.

41
Mark Byers
nums = range(10)
for i in range(0, len(nums)-1, 2):
    print nums[i]

Un peu sale mais ça marche.

5
Ishpeck

Cela pourrait ne pas être aussi rapide que la solution izip_longest (je ne l'ai pas testée en réalité), mais cela fonctionnera avec python <2.6 (izip_longest a été ajouté dans la version 2.6):

from itertools import imap

def grouper(n, iterable):
    "grouper(3, 'ABCDEFG') --> ('A,'B','C'), ('D','E','F'), ('G',None,None)"
    args = [iter(iterable)] * n

    return imap(None, *args)

Si vous devez utiliser une version antérieure à 2.3, vous pouvez remplacer la carte intégrée par imap. L'inconvénient est qu'il ne permet pas de personnaliser la valeur de remplissage.

2
lambacck

Si vous avez le contrôle sur la structure de la liste, la meilleure chose à faire en Pythonique serait probablement de la changer:

l=[1,2,3,4]

à:

l=[(1,2),(3,4)]

Ensuite, votre boucle serait:

for i,j in l:
    print i, j
0
Jorenko