Em Python, qual é a melhor maneira de criar uma nova lista cujos itens são iguais aos de alguma outra lista, mas na ordem inversa? (Não quero modificar a lista existente no local.)
Aqui está uma solução que me ocorreu:
new_list = list(reversed(old_list))
Também é possível duplicar e, em old_list
seguida, inverter a duplicata no local:
new_list = list(old_list) # or `new_list = old_list[:]`
new_list.reverse()
Existe uma opção melhor que eu esqueci? Se não, há um motivo convincente (como eficiência) para usar uma das abordagens acima em vez da outra?
fonte
list(reversed(oldlist))
. À excepção de um menor micro-otimização, há alguma razão para preferir[::-1]
areversed()
?reversed
tem uma grande vantagem quando você não precisa da lista, porque não desperdiça memória ou tempo inicial para criá-la. Mas quando você fazer precisar da lista, utilizando[::-1]
, em vez delist(reversed())
é análogo ao uso de uma[listcomp]
vez delist(genexpr)
.[::-1]
significa remover o último elemento de uma lista, em vez de invertê-lo.reversed(list)
afirma exatamente o que está fazendo; ele explicita sua intenção, no sentido de "Explícito é melhor do que implícito", "A legibilidade conta" e "Esparso é melhor do que denso".Agora vamos
timeit
. Dica: Alex[::-1]
é o mais rápido :)Atualização: método de comp de lista adicionado sugerido por inspectorG4dget. Vou deixar os resultados falarem por si.
fonte
[::-1]
Ajustes
Vale a pena fornecer um benchmark / ajuste de linha de base para os cálculos de timeit por sdolan que mostram o desempenho de 'reverso' sem a
list()
conversão frequentemente desnecessária . Estalist()
operação adiciona mais 26 usecs ao tempo de execução e só é necessária no caso de um iterador ser inaceitável.Resultados:
Cálculos:
Conclusões:
A conclusão desses testes
reversed()
é mais rápida do que a fatia[::-1]
em 12,4 usecsfonte
''.join(reversed(['1','2','3']))
, o método de fatia ainda é> 30% mais rápido.