Question Traverser une liste dans l'ordre inverse en Python


Je peux donc partir de len(collection) et finir en collection[0].

EDIT: Désolé, j'ai oublié de mentionner que je veux aussi pouvoir accéder à l'index de boucle.


488
2018-02-09 19:04


origine


Réponses:


Utilisez le reversed() fonction intégrée:

>>> a = ["foo", "bar", "baz"]
>>> for i in reversed(a):
...     print i
... 
baz
bar
foo

Pour accéder également à l'index d'origine:

>>> for i, e in reversed(list(enumerate(a))):
...     print i, e
... 
2 baz
1 bar
0 foo

811
2018-02-09 19:05



Tu peux faire:

for item in my_list[::-1]:
    print item

(Ou tout ce que vous voulez faire dans la boucle for.)

le [::-1] slice inverse la liste dans la boucle for (mais ne modifiera pas réellement votre liste "de façon permanente").


121
2018-02-09 19:07



Si vous avez besoin de l'index de boucle et que vous ne souhaitez pas parcourir la liste entière deux fois ou utiliser de la mémoire supplémentaire, j'écrirais un générateur.

def reverse_enum(L):
   for index in reversed(xrange(len(L))):
      yield index, L[index]

L = ['foo', 'bar', 'bas']
for index, item in reverse_enum(L):
   print index, item

56
2018-02-09 19:14



Cela peut être fait comme ceci:

pour i dans l'intervalle (len (collection) -1, -1, -1):
    collection d'impression [i]

    # print (collection [i]) pour python 3. +

Donc, votre hypothèse était assez proche :) Un peu gênant, mais en gros, il dit: commencez par 1 moins que len(collection), continuez jusqu'à ce que vous arriviez juste avant -1, par pas de -1.

Fyi, le help La fonction est très utile car elle vous permet d'afficher les documents pour quelque chose à partir de la console Python, par exemple:

help(range)


41
2018-02-09 23:18



le reversed fonction intégrée est pratique:

for item in reversed(sequence):

le Documentation pour inversé explique ses limites.

Pour les cas où je dois faire marche arrière d'une séquence avec l'index (par exemple pour des modifications sur place modifiant la longueur de la séquence), j'ai cette fonction définie comme un module my codeutil:

import itertools
def reversed_enumerate(sequence):
    return itertools.izip(
        reversed(xrange(len(sequence))),
        reversed(sequence),
    )

Celui-ci évite de créer une copie de la séquence. De toute évidence, le reversed les limitations s'appliquent toujours.


18
2017-10-11 06:28



>>> l = ["a","b","c","d"]
>>> l.reverse()
>>> l
['d', 'c', 'b', 'a']

OU

>>> print l[::-1]
['d', 'c', 'b', 'a']

6
2017-09-11 06:51



Que diriez-vous sans recréer une nouvelle liste, vous pouvez le faire en indexant:

>>> foo = ['1a','2b','3c','4d']
>>> for i in range(len(foo)):
...     print foo[-(i+1)]
...
4d
3c
2b
1a
>>>

OU

>>> length = len(foo)
>>> for i in range(length):
...     print foo[length-i-1]
...
4d
3c
2b
1a
>>>

4
2018-02-15 05:04