Para que eu possa começar len(collection)
e terminar collection[0]
.
Eu também quero poder acessar o índice do loop.
Use a reversed()
função interna:
>>> a = ["foo", "bar", "baz"]
>>> for i in reversed(a):
... print(i)
...
baz
bar
foo
Para acessar também o índice original, use enumerate()
na sua lista antes de passá-lo para reversed()
:
>>> for i, e in reversed(list(enumerate(a))):
... print(i, e)
...
2 baz
1 bar
0 foo
Como enumerate()
retorna um gerador e os geradores não podem ser revertidos, é necessário convertê-lo para um list
primeiro.
reversed()
não modifica a lista.reversed()
não faz uma cópia da lista (caso contrário, exigiria memória adicional O (N)). Se você precisar modificar a lista, usealist.reverse()
; se você precisar de uma cópia da lista em ordem inversa, usealist[::-1]
.Você pode fazer:
(Ou o que você quiser fazer no loop for.)
A
[::-1]
fatia reverte a lista no loop for (mas na verdade não modifica sua lista "permanentemente").fonte
[::-1]
cria uma cópia superficial, portanto, não altera a matriz nem "permanentemente" nem "temporariamente".0
, provavelmente-1
, termina no início ) e passo :-1
(itera para trás na lista,1
item de cada vez).reversed()
Se você precisar do índice de loop e não quiser percorrer a lista inteira duas vezes ou usar memória extra, eu escreveria um gerador.
fonte
reversed(xrange(len(L)))
produz os mesmos índices quexrange(len(L)-1, -1, -1)
.for index, item in enumerate(reversed(L)): print len(L)-1-index, item
Isso pode ser feito assim:
Então, seu palpite foi bem próximo :) Um pouco estranho, mas é basicamente o seguinte: comece com 1 a menos que
len(collection)
, continue até chegar antes de -1, em etapas de -1.Fyi, a
help
função é muito útil, pois permite exibir os documentos de algo no console do Python, por exemplo:help(range)
fonte
-1
. Eu diria apenasreversed(xrange(len(collection)))
A
reversed
função embutida é útil:A documentação para reverso explica suas limitações.
Nos casos em que eu tenho que percorrer uma sequência ao contrário, juntamente com o índice (por exemplo, para modificações no local que alteram o comprimento da sequência), eu tenho essa função definida no meu módulo codeutil:
Este evita a criação de uma cópia da sequência. Obviamente, o
reversed
limitações ainda se aplicam.fonte
Que tal, sem recriar uma nova lista, você pode fazer isso indexando:
OU
fonte
OU
fonte
Eu gosto da abordagem de gerador de uma linha:
fonte
Além disso, você pode usar as funções "range" ou "count". Do seguinte modo:
Você também pode usar "count" do itertools da seguinte maneira:
fonte
3 foo\n2 bar\n1 baz
Use
list.reverse()
e, em seguida, itere como faria normalmente.http://docs.python.org/tutorial/datastructures.html
fonte
Uma abordagem sem importações:
ou
fonte
fonte
pelo que vale a pena, você também pode fazê-lo assim. muito simples.
fonte
print a[-(x+1)]
e evitar reatribuir o índice no corpo do loop.Uma maneira expressiva de obter
reverse(enumerate(collection))
em python 3:no python 2:
Não sei por que não temos uma abreviação para isso, por exemplo:
ou por que não temos
reversed_range()
fonte
Se você precisa do índice e sua lista é pequena, a maneira mais legível é fazer o
reversed(list(enumerate(your_list)))
que a resposta aceita diz. Mas isso cria uma cópia da sua lista, portanto, se a sua lista estiver ocupando uma grande parte da sua memória, você deverá subtrair o índice retornadoenumerate(reversed())
delen()-1
.Se você só precisa fazer isso uma vez:
ou se você precisar fazer isso várias vezes, use um gerador:
fonte
a função reversa é útil aqui:
fonte
Você também pode usar um
while
loop:fonte
Você pode usar um índice negativo em um loop for comum:
Para acessar o índice como se você estivesse iterando adiante em uma cópia invertida da coleção, use
i - 1
:Para acessar o índice original não revertido, use
len(collection) - i
:fonte
Se você não se importa que o índice seja negativo, você pode:
fonte
Eu acho que a maneira mais elegante é transformar
enumerate
ereversed
usar o seguinte geradorque gera o inverso do
enumerate
iteradorExemplo:
Resultado:
fonte
As outras respostas são boas, mas se você quiser fazer o estilo de compreensão da lista
fonte
Para usar índices negativos: inicie em -1 e volte em -1 a cada iteração.
fonte
Uma maneira simples:
fonte
Eu acho que esse também é um jeito simples de fazer isso ... leia do final e continue diminuindo até o tamanho da lista, já que nunca executamos o índice "end", portanto adicionamos -1 também
fonte
Assumindo que a tarefa é encontrar o último elemento que satisfaça alguma condição de uma lista (ou seja, primeiro ao olhar para trás), estou recebendo os seguintes números:
Portanto, a opção mais feia
xrange(len(xs)-1,-1,-1)
é a mais rápida.fonte
você pode usar um gerador:
finalmente:
espero que isso ajude você.
fonte