309 votes

Comment faire une boucle dans une liste par deux ?

Je veux faire une boucle dans une liste Python et traiter 2 éléments de la liste à la fois. Quelque chose comme ceci dans un autre langage :

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

Quelle est la meilleure façon d'y parvenir ?

2 votes

Jetez un coup d'œil aux réponses à cette question : stackoverflow.com/questions/434287/

0 votes

Quelle version de Python utilisez-vous ?

490voto

Brian R. Bondy Points 141769

Vous pouvez utiliser for in range avec une taille d'étape de 2 :

Python 2

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

Python 3

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.

38 votes

+1. Il convient de noter que vous décrivez les fonctions xrange et range de Python 2. En Python 3, range() génère un objet itérable.

8 votes

Dans Python 3, range() a une taille de pas optionnelle et xrange() n'existe plus

0 votes

Qu'en est-il de la valeur flottante ? J'ai obtenu l'erreur suivante integer argument expected, got float

141voto

jathanism Points 15208

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'indice de départ (par défaut, il s'agit du début de la liste ou de 0), le deuxième est l'indice de fin de tranche (par défaut, il s'agit de la fin de la liste) et le troisième chiffre est le décalage ou le pas.

13 votes

Cela fonctionnera très bien, pour autant que le list n'est pas énorme. Si le list es énorme, tu en fais une copie quand tu utilises la syntaxe de découpage...

1 votes

Votre réponse est bonne pour moi lorsque j'utilise le paramètre : range(my_param)[::2]

1 votes

J'aime que la gamme soit implicite avec cela. Il n'est pas nécessaire de connaître la longueur de la liste pour la comparer à une variable.

85voto

carl Points 25879

Le plus simple, à mon avis, est le suivant :

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

Out: 1 2
     3 4
     5 6

Pas d'importations supplémentaires ou quoi que ce soit. Et très élégant, à mon avis.

11 votes

Cela ne répond pas tout à fait à la question posée.

21 votes

Bien sûr, il ne correspond pas exactement à la question, mais il fait exactement ce que je cherchais. Joliment aussi.

3 votes

Pourquoi utiliser iter il n'est pas nécessaire de le faire ?

46voto

Mark Byers Points 318575

Si vous utilisez Python 2.6 ou une version plus récente, vous pouvez utiliser le grouper recette de la 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)

Appelez 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 .

0 votes

+1 C'est la méthode que la documentation elle-même suggère.

0 votes

Juste au cas où vous vous demandez comment cela fonctionne, considérez que tous les itérateurs dans les arguments avancent ensemble afin que izip prenne toujours l'élément suivant lorsqu'il invoque next() sur ses arguments

7voto

Ishpeck Points 1169
nums = range(10)
for i in range(0, len(nums)-1, 2):
    print nums[i]

C'est un peu sale mais ça marche.

0 votes

Considérant que range / xrange ont un support intégré pour modifier la valeur de l'incrément, cette solution semble un peu idiote.

2 votes

Umm, c'est ce que le dernier paramètre de range fait...

0 votes

Il est supposé que nums est une séquence sur laquelle nous n'avons aucun contrôle. La démonstration commence réellement après la première ligne où j'assigne nums une valeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X