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?
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.
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.
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.
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
.
nums = range(10)
for i in range(0, len(nums)-1, 2):
print nums[i]
Un peu sale mais ça marche.
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.
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