Boucle en arrière en utilisant des indices en Python?


286

J'essaie de boucler de 100 à 0. Comment faire cela en Python?

for i in range (100,0) ne fonctionne pas.


9
BTW, vous voulez probablement boucler de 99 à 0, et rarement de 100 à 0. Cela affecte les réponses.
Acumenus

1
@Acumenus C'est exactement ce que j'ai recherché lorsque je suis arrivé ici. Et pour mémoire, la solution est d'écrire simplement: range(100)[::-1](qui est automatiquement traduit en range(9, -1, -1)) - Testé en python 3.7
Hassan

Réponses:


399

Essayez range(100,-1,-1), le 3ème argument étant l'incrément à utiliser (documenté ici ).

(Les options "plage", démarrage, arrêt, étape sont documentées ici )


3
Je dois également l'utiliser pour supprimer des éléments de la collection, c'est pourquoi je voulais juste les indices.
Joan Venge,

2
le deuxième argument est un de moins que la valeur finale. donc si vous mettez -1 alors la plage s'arrête à 0, si vous mettez -5, la plage s'arrête à -4 (pour un incrément de -1)
mulllhausen

200

À mon avis, c'est le plus lisible:

for i in reversed(xrange(101)):
    print i,

14
C'est mieux que la réponse acceptée car elle n'alloue pas réellement tous les nombres en mémoire (en Python 3, la réponse acceptée ne le serait pas non plus), et c'est plus évident ce qui se passe.
Blixt

5
Python avant 2.6 alloue tous les nombres, car inversé n'a aucun moyen de dire au xrange de revenir en arrière ... (Depuis Python 2.6, il appelle __reversed __ ().)
Robert Siemer

Je préfère reversed(xrange(len(list)))à xrange(len(list)-1:-1:-1); ce dernier a juste l'air bizarre avec tant de personnes -1.
musiphil

1
xrange () n'est plus disponible dans Python 3
Chris Graf

1
En Python 3, rangese comporte de la même manière qu'en xrange2.7. @hacksoi dépend du cas d'utilisation, mais disons que vous effectuez une itération en arrière dans un grand tampon, disons que c'est 10 Mo, puis créer les indices inverses à l'avance prendrait quelques secondes et utiliserait plus de 50 Mo de mémoire. L'utilisation d'un générateur inversé prendrait des millisecondes et n'utiliserait que quelques octets de mémoire.
Blixt

34
for i in range(100, -1, -1)

et une solution légèrement plus longue (et plus lente):

for i in reversed(range(101))

for i in range(101)[::-1]

16

Généralement en Python, vous pouvez utiliser des indices négatifs pour commencer par l'arrière:

numbers = [10, 20, 30, 40, 50]
for i in xrange(len(numbers)):
    print numbers[-i - 1]

Résultat:

50
40
30
20
10

8

Pourquoi votre code n'a pas fonctionné

Votre code for i in range (100, 0)va bien, sauf

le troisième paramètre ( step) est par défaut +1. Vous devez donc spécifier le 3ème paramètre à range () -1pour reculer.

for i in range(100, -1, -1):
    print(i)

REMARQUE: cela inclut 100 et 0 dans la sortie.

Il y a plusieurs façons.

Meilleure façon

Pour la manière pythonique, vérifiez PEP 0322 .

Il s'agit d'un exemple pythonique Python3 pour imprimer de 100 à 0 (y compris 100 et 0).

for i in reversed(range(101)):
    print(i)

1
oui, PEP-322 nous donne un moyen clair et moins sujet aux erreurs pour inverser les itérations.
Allen Shen

1
C'est bon. La recommandation sur la façon de mettre reverseden œuvre dans PEP-322 est trompeuse, il convient donc de noter qu'il reversedfera appel __reversed__à l'itérable et renverra le résultat, et pour les rangeobjets, il s'agit d'un range_objectitérateur évalué paresseux . En bref: l'utilisation de cette méthode est toujours une évaluation paresseuse.
Ruzihm

5

Une autre solution:

z = 10
for x in range (z):
   y = z-x
   print y

Résultat:

10
9
8
7
6
5
4
3
2
1

Astuce: Si vous utilisez cette méthode pour compter les indices dans une liste, vous voudrez -1 à partir de la valeur 'y', car vos indices de liste commenceront à 0.


3

La réponse simple pour résoudre votre problème pourrait être la suivante:

for i in range(100):
    k = 100 - i
    print(k)


1

Court et doux. C'était ma solution lors des cours de codeAcademy. Imprime une chaîne dans l'ordre des révolutions.

def reverse(text):
    string = ""
    for i in range(len(text)-1,-1,-1):
        string += text[i]
    return string    

1

Vous pouvez toujours augmenter la plage et soustraire d'une variable dans votre cas 100 - ii in range( 0, 101 ).

for i in range( 0, 101 ):
    print 100 - i

0

J'ai essayé cela dans l'un des exercices de codeacademy (inverser les caractères d'une chaîne sans utiliser ni inversé ni :: -1)

def reverse(text):
    chars= []
    l = len(text)
    last = l-1
    for i in range (l):
        chars.append(text[last])
        last-=1

    result= ""   
    for c in chars:
        result += c
    return result
print reverse('hola')

0

Je voulais parcourir deux listes en arrière en même temps, donc j'avais besoin d'un indice négatif. Voici ma solution:

a= [1,3,4,5,2]
for i in range(-1, -len(a), -1):
    print(i, a[i])

Résultat:

-1 2
-2 5
-3 4
-4 3
-5 1

0

Oh d'accord, lisez mal la question, je suppose qu'il s'agit de revenir en arrière dans un tableau? si oui, j'ai ceci:

array = ["ty", "rogers", "smith", "davis", "tony", "jack", "john", "jill", "harry", "tom", "jane", "hilary", "jackson", "andrew", "george", "rachel"]


counter = 0   

for loop in range(len(array)):
    if loop <= len(array):
        counter = -1
        reverseEngineering = loop + counter
        print(array[reverseEngineering])

Il semble que votre réponse soit le copier-coller du test que vous avez effectué. Veuillez essayer de publier un exemple minimal: l'utilisation de globalet timen'est pas pertinente pour la question initiale.
Michael Doubez

-1

Vous pouvez également créer un mécanisme inverse personnalisé en python. Qui peut être utilisé n'importe où pour boucler une boucle en arrière

class Reverse:
    """Iterator for looping over a sequence backwards"""
    def __init__(self, seq):
        self.seq = seq
        self.index = len(seq)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index -= 1
        return self.seq[self.index]


>>> d = [1,2,3,4,5]
>>> for i in Reverse(d):
...   print(i)
... 
5
4
3
2
1

-2
a = 10
for i in sorted(range(a), reverse=True):
    print i

Bienvenue dans Stack Overflow! Veuillez envisager de modifier votre message pour ajouter plus d'explications sur ce que fait votre code et pourquoi il résoudra le problème. Une réponse qui contient principalement du code (même si cela fonctionne) n'aidera généralement pas l'OP à comprendre leur problème.
SuperBiasMan

Vous vous rendez compte que l'utilisation sortedstockera inutilement toute la liste en mémoire, non? Ceci est du gaspillage et n'est pas réalisable pour les grands a.
Acumenus
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.