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 )
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)
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]
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 =10for x in range (z):
y = z-x
print y
Résultat:
10987654321
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.
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-1for i in range (l):
chars.append(text[last])
last-=1
result=""for c in chars:
result += c
return result
print reverse('hola')
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
classReverse:"""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:raiseStopIteration
self.index -=1return self.seq[self.index]>>> d =[1,2,3,4,5]>>>for i inReverse(d):...print(i)...54321
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.
range(100)[::-1]
(qui est automatiquement traduit enrange(9, -1, -1)
) - Testé en python 3.7Réponses:
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 )
la source
À mon avis, c'est le plus lisible:
la source
reversed(xrange(len(list)))
àxrange(len(list)-1:-1:-1)
; ce dernier a juste l'air bizarre avec tant de personnes-1
.range
se comporte de la même manière qu'enxrange
2.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.et une solution légèrement plus longue (et plus lente):
la source
Généralement en Python, vous pouvez utiliser des indices négatifs pour commencer par l'arrière:
Résultat:
la source
Pourquoi votre code n'a pas fonctionné
Votre code
for i in range (100, 0)
va bien, saufle troisième paramètre (
step
) est par défaut+1
. Vous devez donc spécifier le 3ème paramètre à range ()-1
pour reculer.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).
la source
reversed
en œuvre dans PEP-322 est trompeuse, il convient donc de noter qu'ilreversed
fera appel__reversed__
à l'itérable et renverra le résultat, et pour lesrange
objets, il s'agit d'unrange_object
itérateur évalué paresseux . En bref: l'utilisation de cette méthode est toujours une évaluation paresseuse.Une autre solution:
Résultat:
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.
la source
La réponse simple pour résoudre votre problème pourrait être la suivante:
la source
for var in range(10,-1,-1)
travauxla source
Court et doux. C'était ma solution lors des cours de codeAcademy. Imprime une chaîne dans l'ordre des révolutions.
la source
Vous pouvez toujours augmenter la plage et soustraire d'une variable dans votre cas
100 - i
oùi in range( 0, 101 )
.la source
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)
la source
Je voulais parcourir deux listes en arrière en même temps, donc j'avais besoin d'un indice négatif. Voici ma solution:
Résultat:
la source
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:
la source
global
ettime
n'est pas pertinente pour la question initiale.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
la source
la source
sorted
stockera inutilement toute la liste en mémoire, non? Ceci est du gaspillage et n'est pas réalisable pour les grandsa
.