@kdlannoy De acordo com a página vinculada na resposta, "Em comparação com o fatiamento estendido, como intervalo (1,4) [:: - 1], reversed () é mais fácil de ler, roda mais rápido e usa substancialmente menos memória. "
Jim Oldfield
5
Quando testei, esse fatiamento era duas vezes mais rápido (ao reverter uma lista de 10 mil elementos e criar uma lista a partir dela). Eu não testei o consumo de memória. reversepode ser mais rápido, se você não precisar transmitir para a lista posteriormente.
Dakkaron 23/08/16
5
vale notar que isso não é o mesmo que reverso ([1,2,3]), nb o 'd' no final ... que é uma das outras respostas abaixo, que faz isso no lugar, enquanto isso retorna um iterador.
Luciano
14
Por que usar em reversed()vez de cortar? Leia o Zen do Python, regra número 7: A legibilidade conta!
Funciona para qualquer interface, não apenas para listas. A desvantagem é que não está no lugar.
Swiss,
6
@ Tim ele retorna uma fatia, por isso não muda o conteúdo da lista reais
Fortran
12
@lunixbochs revertida retorna um iterador e não uma lista em Python 3.
suíça
2
a menos que naturalmente adequadamente encapsulado dentro da matriz
Einar Petersen
2
Eu concordo com @Swiss. +1 desde que a pergunta era : preciso ter os elementos de uma matriz, mas do fim ao começo. + reversedretorna um listreverseiteratorobjeto (Python 2.7.x), que deve ser iterado através de + fatiamento reverso retorna uma lista / tupla / str invertida (dependendo do que você está fatiando). @ Einar Petersen que está invertendo uma string, para que a saída esteja correta. Tente:co2=['ae','ad','ac','ab','aa','z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'] >>> co2[::-1]
Aaron Newton
368
>>> L =[0,10,20,40]>>> L.reverse()>>> L
[40,20,10,0]
Usar fatias, por exemplo, array = array [:: - 1], é um truque interessante e muito pitonico, mas talvez um pouco obscuro para iniciantes. Usar o método reverse () é uma boa maneira de codificar dia a dia, porque é facilmente legível.
No entanto, se você precisar reverter uma lista como em uma pergunta de entrevista, provavelmente não poderá usar métodos incorporados como esses. O entrevistador examinará como você aborda o problema, e não a profundidade do conhecimento em Python; é necessária uma abordagem algorítmica. O exemplo a seguir, usando uma troca clássica, pode ser uma maneira de fazer isso:
def reverse_in_place(lst):# Declare a function
size = len(lst)# Get the length of the sequence
hiindex = size -1
its = size/2# Number of iterations requiredfor i in xrange(0, its):# i is the low index pointer
temp = lst[hiindex]# Perform a classic swap
lst[hiindex]= lst[i]
lst[i]= temp
hiindex -=1# Decrement the high index pointerprint"Done!"# Now test it!!
array =[2,5,8,9,12,19,25,27,32,60,65,1,7,24,124,654]print array # Print the original sequence
reverse_in_place(array)# Call the function passing the listprint array # Print reversed list**The result:**[2,5,8,9,12,19,25,27,32,60,65,1,7,24,124,654]Done![654,124,24,7,1,65,60,32,27,25,19,12,9,8,5,2]
Observe que isso não funcionará em tuplas ou seqüências de cadeias, porque cadeias e tuplas são imutáveis, ou seja, você não pode gravá-las para alterar elementos.
O swap clássico poderia ser feito via lst[hiindex], lst[i] = lst[i], lst[hiindex], eu acho ... ;-)
Samoth
@ Samoth Essa sintaxe não é tão clara e o comportamento não é exatamente óbvio. Passos distintos fazem mais sentido.
187 Anthony Anthony
por que as pessoas dizem que coisas como array [:: - 1] são pitônicas? O python zen nos ensina que o explícito é melhor do que o implícito e a legibilidade conta. Coisas assim não são explícitas nem legíveis.
K4ppa
1
@ k4ppa: array[::-1]é perfeitamente legível e perfeitamente explícito se você conhece Python . "Legível" não significa "alguém que nunca usou o Python slicing antes deve poder lê-lo"; a [::-1]fatia de reversão é um idioma ridiculamente comum no Python (você o encontrará no código existente o tempo todo) e é perfeitamente legível se você usa regularmente o Python . Claro, first10 = [], for i in range(10): first10.append(array[i])é clara e explícita, mas isso não significa que seja melhor do que first10 = array[:10].
ShadowRanger
19
Acho (ao contrário de algumas outras sugestões) que l.reverse()é de longe a maneira mais rápida de reverter uma longa lista no Python 3 e 2. Gostaria de saber se outras pessoas podem replicar esses tempos.
l[::-1]provavelmente é mais lento porque copia a lista antes de revertê-la. A adição da list()chamada no iterador feita por reversed(l)deve adicionar uma sobrecarga. Obviamente, se você deseja uma cópia da lista ou de um iterador, use os respectivos métodos, mas se desejar reverter a lista, l.reverse()parece ser o caminho mais rápido.
Funções
def rev_list1(l):return l[::-1]def rev_list2(l):return list(reversed(l))def rev_list3(l):
l.reverse()return l
list.reverseé o mais rápido, porque ele inverte no lugar
warvariuc
Você está correto list.reverse()é o mais rápido, mas está penalizando reversed(o que é melhor usado quando você não deseja um novo list, apenas para iterar um existente listna ordem inversa sem alterar o original) e a fatia (que também evita a alteração do original) liste geralmente é mais rápido do que reversedquando a entrada é pequena). Sim, se você não precisar da cópia, qualquer coisa que a copie será mais cara, mas na maioria das vezes, não deseja alterar o valor original.
ShadowRanger
Parece que reversedainda perde paralist.reverse() isso, mas, como não altera a entrada list, é melhor em muitos casos. A perda para reversedé pequena (~ 1/6 a mais que list.reverse()).
Estava procurando como fazer isso sem usar a função reversa. Obrigado.
Bernard 'Beta Berlin' Parah
Ou para reverter na lista de uso lugar = list.reverse ()
SimonM
6
Resumo dos métodos com explicação e resultados de tempo
Existem várias boas respostas, mas se espalham e a maioria não indica as diferenças fundamentais de cada abordagem.
No geral, é melhor usar funções / métodos internos para reverter, como acontece com praticamente qualquer função. Nesse caso, eles são aproximadamente 2 a 8 vezes mais rápidos em listas curtas (10 itens) e até ~ 300 vezes mais rápidos em listas longas, em comparação com os meios criados manualmente de indexação. Isso faz sentido, pois eles têm especialistas para criá-los, examinar e otimizar. Eles também são menos propensos a defeitos e mais propensos a lidar com casos de borda e canto.
Considere também se você deseja:
Inverter uma lista existente no local
A melhor solução é o object.reverse()método
Crie um iterador no verso da lista (porque você o alimentará em um loop for, em um gerador etc.)
A melhor solução é reversed(object)criar o iterador
ou crie uma cópia completa na ordem inversa
A melhor solução é usar fatias com tamanho de etapa -1: object[::-1]
Script de teste
Aqui está o início do meu script de teste para os métodos abordados. Coloque todos os trechos de código nesta resposta juntos para criar um script que execute todas as maneiras diferentes de reverter uma lista e tempo cada uma (saída mostrada na última seção).
from timeit import timeit
from copy import copy
def time_str_ms(t):return'{0:8.2f} ms'.format(t *1000)
Método 1: Reverse in place com obj.reverse ()
Se o objetivo é apenas reverter a ordem dos itens em uma lista existente, sem passar por cima deles ou obter uma cópia para trabalhar, use a <list>.reverse()função Execute isso diretamente em um objeto de lista e a ordem de todos os itens será revertida:
Observe que o seguinte reverterá a variável original que é fornecida, embora ela também retorne a lista invertida. ou seja, você pode criar uma cópia usando esta função de saída. Normalmente, você não faria uma função para isso, mas eu fiz isso para usar o código de temporização no final.
Testaremos o desempenho dessas duas maneiras - primeiro apenas revertendo uma lista no local (altera a lista original), depois copiando a lista e revertendo-a depois.
def rev_in_place(mylist):
mylist.reverse()return mylist
def rev_copy_reverse(mylist):
a = copy(mylist)
a.reverse()return a
Método 2: reverter uma lista usando fatias obj[::-1]
O método de fatiamento de índice interno permite que você faça uma cópia de parte de qualquer objeto indexado.
Não afeta o objeto original
Ele cria uma lista completa, não um iterador
A sintaxe genérica é: <object>[first_index:last_index:step]. Para explorar corte para criar uma simples lista invertida, use: <list>[::-1]. Ao deixar uma opção vazia, ela os define como padrão do primeiro e do último elemento do objeto (revertido se o tamanho da etapa for negativo).
A indexação permite usar números negativos, que são contados do final do índice do objeto para trás (ie -2 é o penúltimo item). Quando o tamanho da etapa for negativo, ele começará com o último item e indexará para trás por esse valor. Há alguma lógica de início-fim associada a isso que foi otimizada.
def rev_slice(mylist):
a = mylist[::-1]return a
Método 3: reverter uma lista com a reversed(obj)função de iterador
Existe uma reversed(indexed_object)função:
Isso cria um iterador de índice reverso, não uma lista. Ótimo se você estiver alimentando um loop para obter melhor desempenho em grandes listas
Isso cria uma cópia e não afeta o objeto original
Teste com um iterador bruto e criando uma lista a partir do iterador.
def reversed_iterator(mylist):
a = reversed(mylist)return a
def reversed_with_list(mylist):
a = list(reversed(mylist))return a
Método 4: lista reversa com indexação personalizada / manual
Como o tempo mostrará, criar seus próprios métodos de indexação é uma má idéia. Use os métodos internos, a menos que você precise fazer algo realmente personalizado.
Dito isto, não há uma penalidade enorme com tamanhos de lista menores, mas quando você aumenta a penalidade se torna tremenda. Tenho certeza de que meu código abaixo pode ser otimizado, mas continuarei com os métodos internos.
def rev_manual_pos_gen(mylist):
max_index = len(mylist)-1return[ mylist[max_index - index]for index in range(len(mylist))]def rev_manual_neg_gen(mylist):## index is 0 to 9, but we need -1 to -10return[ mylist[-index-1]for index in range(len(mylist))]def rev_manual_index_loop(mylist):
a =[]
reverse_index = len(mylist)-1for index in range(len(mylist)):
a.append(mylist[reverse_index - index])return a
def rev_manual_loop(mylist):
a =[]
reverse_index = len(mylist)for index, _ in enumerate(mylist):
reverse_index -=1
a.append(mylist[reverse_index])return a
Cronometrando cada método
A seguir, o restante do script, para cronometrar cada método de reversão. Ele mostra que a inversão no local obj.reverse()e a criação do reversed(obj)iterador são sempre as mais rápidas, enquanto o uso de fatias é a maneira mais rápida de criar uma cópia.
Também prova não tentar criar uma maneira de fazê-lo por conta própria, a menos que você precise!
loops_to_test =100000
number_of_items =10
list_to_reverse = list(range(number_of_items))if number_of_items <15:print("a: {}".format(list_to_reverse))print('Loops: {:,}'.format(loops_to_test))# List of the functions we want to test with the timer, in print order
fcns =[rev_in_place, reversed_iterator, rev_slice, rev_copy_reverse,
reversed_with_list, rev_manual_pos_gen, rev_manual_neg_gen,
rev_manual_index_loop, rev_manual_loop]
max_name_string = max([ len(fcn.__name__)for fcn in fcns ])for fcn in fcns:
a = copy(list_to_reverse)# copy to start fresh each loop
out_str =' | out = {}'.format(fcn(a))if number_of_items <15else''# Time in ms for the given # of loops on this fcn
time_str = time_str_ms(timeit(lambda: fcn(a), number=loops_to_test))# Get the output string for this function
fcn_str ='{}(a):'.format(fcn.__name__)# Add the correct string length to accommodate the maximum fcn name
format_str ='{{fx:{}s}} {{time}}{{rev}}'.format(max_name_string +4)print(format_str.format(fx=fcn_str, time=time_str, rev=out_str))
Resultados de tempo
Os resultados mostram que o dimensionamento funciona melhor com os métodos internos mais adequados para uma determinada tarefa. Em outras palavras, à medida que a contagem de elementos do objeto aumenta, os métodos internos começam a ter resultados de desempenho muito superiores.
Também é melhor usar o melhor método interno que alcança diretamente o que você precisa do que encadear as coisas. ou seja, fatiar é melhor se você precisar de uma cópia da lista invertida - é mais rápido do que criar uma lista a partir da reversed()função e mais rápido do que fazer uma cópia da lista e, em seguida, fazer um no local obj.reverse(). Mas se qualquer um desses métodos é realmente tudo o que você precisa, eles são mais rápidos, mas nunca mais que o dobro da velocidade. Enquanto isso - métodos manuais personalizados podem demorar mais tempo, especialmente em listas muito grandes.
Para dimensionar, com uma lista de 1000 itens, a reversed(<list>)chamada de função leva ~ 30 ms para configurar o iterador, a reversão no local leva apenas ~ 55 ms, usando o método de fatia leva ~ 210 ms para criar uma cópia da lista completa invertida, mas o método manual mais rápido que fiz levou ~ 8400 ms !!
Com 2 itens na lista:
a:[0,1]Loops:100,000
rev_in_place(a):24.70 ms | out =[1,0]
reversed_iterator(a):30.48 ms | out =<list_reverseiterator object at 0x0000020242580408>
rev_slice(a):31.65 ms | out =[1,0]
rev_copy_reverse(a):63.42 ms | out =[1,0]
reversed_with_list(a):48.65 ms | out =[1,0]
rev_manual_pos_gen(a):98.94 ms | out =[1,0]
rev_manual_neg_gen(a):88.11 ms | out =[1,0]
rev_manual_index_loop(a):87.23 ms | out =[1,0]
rev_manual_loop(a):79.24 ms | out =[1,0]
Com 10 itens na lista:
rev_in_place(a):23.39 ms | out =[9,8,7,6,5,4,3,2,1,0]
reversed_iterator(a):30.23 ms | out =<list_reverseiterator object at 0x00000290A3CB0388>
rev_slice(a):36.01 ms | out =[9,8,7,6,5,4,3,2,1,0]
rev_copy_reverse(a):64.67 ms | out =[9,8,7,6,5,4,3,2,1,0]
reversed_with_list(a):50.77 ms | out =[9,8,7,6,5,4,3,2,1,0]
rev_manual_pos_gen(a):162.83 ms | out =[9,8,7,6,5,4,3,2,1,0]
rev_manual_neg_gen(a):167.43 ms | out =[9,8,7,6,5,4,3,2,1,0]
rev_manual_index_loop(a):152.04 ms | out =[9,8,7,6,5,4,3,2,1,0]
rev_manual_loop(a):183.01 ms | out =[9,8,7,6,5,4,3,2,1,0]
E com 1000 itens na lista:
rev_in_place(a):56.37 ms
reversed_iterator(a):30.47 ms
rev_slice(a):211.42 ms
rev_copy_reverse(a):295.74 ms
reversed_with_list(a):418.45 ms
rev_manual_pos_gen(a):8410.01 ms
rev_manual_neg_gen(a):11054.84 ms
rev_manual_index_loop(a):10543.11 ms
rev_manual_loop(a):15472.66 ms
Se você deseja armazenar os elementos da lista invertida em alguma outra variável, pode usar revArray = array[::-1]ou revArray = list(reversed(array)).
Mas a primeira variante é um pouco mais rápida:
z = range(1000000)
startTimeTic = time.time()
y = z[::-1]print("Time: %s s"%(time.time()- startTimeTic))
f = range(1000000)
startTimeTic = time.time()
g = list(reversed(f))print("Time: %s s"%(time.time()- startTimeTic))
Usando alguma lógica da velha escola para praticar para entrevistas.
Trocar números da frente para trás. Usando dois ponteirosindex[0] and index[last]
def reverse(array):
n = array
first =0
last = len(array)-1while first < last:
holder = n[first]
n[first]= n[last]
n[last]= holder
first +=1
last -=1return n
input ->[-1,1,2,3,4,5,6]
output ->[6,1,2,3,4,5,-1]
A rigor, a questão não é como retornar uma lista ao contrário, mas como reverter uma lista com um exemplo de nome de lista array.
Para inverter uma lista chamada "array"use array.reverse().
O método de fatia incrivelmente útil, conforme descrito, também pode ser usado para reverter uma lista no local, definindo a lista como uma modificação fatiada de si mesma usando array = array[::-1].
Com uma quantidade mínima de funções integradas, assumindo que as configurações da entrevista
array =[1,2,3,4,5,6,7,8]
inverse =[]#create container for inverse array
length = len(array)#to iterate later, returns 8
counter = length -1#because the 8th element is on position 7 (as python starts from 0)for i in range(length):
inverse.append(array[counter])
counter -=1print(inverse)
Você sempre pode tratar a lista como uma pilha, apenas retirando os elementos da parte superior da pilha no final da lista. Dessa forma, você tira proveito das características first in last out de uma pilha. Claro que você está consumindo a primeira matriz. Eu gosto desse método, pois é bastante intuitivo, pois você vê uma lista sendo consumida no back-end enquanto a outra é criada no front-end.
>>> l =[1,2,3,4,5,6]; nl=[]>>>while l:
nl.append(l.pop())>>>print nl
[6,5,4,3,2,1]
Aqui está uma maneira de avaliar preguiçosamente o inverso usando um gerador :
def reverse(seq):for x in range(len(seq),-1,-1):#Iterate through a sequence starting from -1 and increasing by -1.yield seq[x]#Yield a value to the generator
Usando a função interna: reversed_array = array.reverse()
A terceira função, na verdade, reverteu o objeto da lista no local. Isso significa que nenhuma cópia dos dados originais é mantida. Essa é uma boa abordagem se você não quiser manter a versão antiga. Mas não parece ser uma solução se você deseja a versão original e invertida.
Esta solução é cerca de 4,5k vezes mais lenta que l[::-1]e ao mesmo tempo muito menos legível. A programação funcional em Python é infelizmente bastante lenta.
reverse
pode ser mais rápido, se você não precisar transmitir para a lista posteriormente.reversed()
vez de cortar? Leia o Zen do Python, regra número 7: A legibilidade conta!A sintaxe de fatia estendida é explicada bem no Python What's new Entry for release
2.3.5
Por solicitação especial em um comentário, esta é a documentação da fatia mais atual .
fonte
reversed
retorna umlistreverseiterator
objeto (Python 2.7.x), que deve ser iterado através de + fatiamento reverso retorna uma lista / tupla / str invertida (dependendo do que você está fatiando). @ Einar Petersen que está invertendo uma string, para que a saída esteja correta. Tente:co2=['ae','ad','ac','ab','aa','z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'] >>> co2[::-1]
Ou
fonte
L=L[::-1]
para realmente reverter a lista de outra forma você está retornando somente os valores em sentido inversob = l[-n:] b.reverse() l = b + l[:len(l) - n]
Isso é para duplicar a lista:
Isso é para inverter a lista no local:
fonte
Eu acho que a melhor maneira de reverter uma lista em Python é fazer:
O trabalho está concluído e agora você tem uma lista invertida.
fonte
Para reverter a mesma lista, use:
Para atribuir lista invertida a alguma outra lista, use:
fonte
Usar fatias, por exemplo, array = array [:: - 1], é um truque interessante e muito pitonico, mas talvez um pouco obscuro para iniciantes. Usar o método reverse () é uma boa maneira de codificar dia a dia, porque é facilmente legível.
No entanto, se você precisar reverter uma lista como em uma pergunta de entrevista, provavelmente não poderá usar métodos incorporados como esses. O entrevistador examinará como você aborda o problema, e não a profundidade do conhecimento em Python; é necessária uma abordagem algorítmica. O exemplo a seguir, usando uma troca clássica, pode ser uma maneira de fazer isso:
Observe que isso não funcionará em tuplas ou seqüências de cadeias, porque cadeias e tuplas são imutáveis, ou seja, você não pode gravá-las para alterar elementos.
fonte
lst[hiindex], lst[i] = lst[i], lst[hiindex]
, eu acho ... ;-)array[::-1]
é perfeitamente legível e perfeitamente explícito se você conhece Python . "Legível" não significa "alguém que nunca usou o Python slicing antes deve poder lê-lo"; a[::-1]
fatia de reversão é um idioma ridiculamente comum no Python (você o encontrará no código existente o tempo todo) e é perfeitamente legível se você usa regularmente o Python . Claro,first10 = []
,for i in range(10): first10.append(array[i])
é clara e explícita, mas isso não significa que seja melhor do quefirst10 = array[:10]
.Acho (ao contrário de algumas outras sugestões) que
l.reverse()
é de longe a maneira mais rápida de reverter uma longa lista no Python 3 e 2. Gostaria de saber se outras pessoas podem replicar esses tempos.l[::-1]
provavelmente é mais lento porque copia a lista antes de revertê-la. A adição dalist()
chamada no iterador feita porreversed(l)
deve adicionar uma sobrecarga. Obviamente, se você deseja uma cópia da lista ou de um iterador, use os respectivos métodos, mas se desejar reverter a lista,l.reverse()
parece ser o caminho mais rápido.Funções
Lista
Temporizações do Python 3.5
Horários do Python 2.7
fonte
list.reverse
é o mais rápido, porque ele inverte no lugarlist.reverse()
é o mais rápido, mas está penalizandoreversed
(o que é melhor usado quando você não deseja um novolist
, apenas para iterar um existentelist
na ordem inversa sem alterar o original) e a fatia (que também evita a alteração do original)list
e geralmente é mais rápido do quereversed
quando a entrada é pequena). Sim, se você não precisar da cópia, qualquer coisa que a copie será mais cara, mas na maioria das vezes, não deseja alterar o valor original.reversed
ainda perde paralist.reverse()
isso, mas, como não altera a entradalist
, é melhor em muitos casos. A perda parareversed
é pequena (~ 1/6 a mais quelist.reverse()
).fonte
Com
reversed
elist
:fonte
fonte
Usar reverso (matriz) seria a melhor rota provável.
Se você precisar entender como implementar isso sem usar o built-in
reversed
.Isso deve levar tempo O (N).
fonte
Resumo dos métodos com explicação e resultados de tempo
Existem várias boas respostas, mas se espalham e a maioria não indica as diferenças fundamentais de cada abordagem.
No geral, é melhor usar funções / métodos internos para reverter, como acontece com praticamente qualquer função. Nesse caso, eles são aproximadamente 2 a 8 vezes mais rápidos em listas curtas (10 itens) e até ~ 300 vezes mais rápidos em listas longas, em comparação com os meios criados manualmente de indexação. Isso faz sentido, pois eles têm especialistas para criá-los, examinar e otimizar. Eles também são menos propensos a defeitos e mais propensos a lidar com casos de borda e canto.
Considere também se você deseja:
object.reverse()
métodoreversed(object)
criar o iteradorobject[::-1]
Script de teste
Aqui está o início do meu script de teste para os métodos abordados. Coloque todos os trechos de código nesta resposta juntos para criar um script que execute todas as maneiras diferentes de reverter uma lista e tempo cada uma (saída mostrada na última seção).
Método 1: Reverse in place com obj.reverse ()
Se o objetivo é apenas reverter a ordem dos itens em uma lista existente, sem passar por cima deles ou obter uma cópia para trabalhar, use a
<list>.reverse()
função Execute isso diretamente em um objeto de lista e a ordem de todos os itens será revertida:Observe que o seguinte reverterá a variável original que é fornecida, embora ela também retorne a lista invertida. ou seja, você pode criar uma cópia usando esta função de saída. Normalmente, você não faria uma função para isso, mas eu fiz isso para usar o código de temporização no final.
Testaremos o desempenho dessas duas maneiras - primeiro apenas revertendo uma lista no local (altera a lista original), depois copiando a lista e revertendo-a depois.
Método 2: reverter uma lista usando fatias
obj[::-1]
O método de fatiamento de índice interno permite que você faça uma cópia de parte de qualquer objeto indexado.
A sintaxe genérica é:
<object>[first_index:last_index:step]
. Para explorar corte para criar uma simples lista invertida, use:<list>[::-1]
. Ao deixar uma opção vazia, ela os define como padrão do primeiro e do último elemento do objeto (revertido se o tamanho da etapa for negativo).A indexação permite usar números negativos, que são contados do final do índice do objeto para trás (ie -2 é o penúltimo item). Quando o tamanho da etapa for negativo, ele começará com o último item e indexará para trás por esse valor. Há alguma lógica de início-fim associada a isso que foi otimizada.
Método 3: reverter uma lista com a
reversed(obj)
função de iteradorExiste uma
reversed(indexed_object)
função:Teste com um iterador bruto e criando uma lista a partir do iterador.
Método 4: lista reversa com indexação personalizada / manual
Como o tempo mostrará, criar seus próprios métodos de indexação é uma má idéia. Use os métodos internos, a menos que você precise fazer algo realmente personalizado.
Dito isto, não há uma penalidade enorme com tamanhos de lista menores, mas quando você aumenta a penalidade se torna tremenda. Tenho certeza de que meu código abaixo pode ser otimizado, mas continuarei com os métodos internos.
Cronometrando cada método
A seguir, o restante do script, para cronometrar cada método de reversão. Ele mostra que a inversão no local
obj.reverse()
e a criação doreversed(obj)
iterador são sempre as mais rápidas, enquanto o uso de fatias é a maneira mais rápida de criar uma cópia.Também prova não tentar criar uma maneira de fazê-lo por conta própria, a menos que você precise!
Resultados de tempo
Os resultados mostram que o dimensionamento funciona melhor com os métodos internos mais adequados para uma determinada tarefa. Em outras palavras, à medida que a contagem de elementos do objeto aumenta, os métodos internos começam a ter resultados de desempenho muito superiores.
Também é melhor usar o melhor método interno que alcança diretamente o que você precisa do que encadear as coisas. ou seja, fatiar é melhor se você precisar de uma cópia da lista invertida - é mais rápido do que criar uma lista a partir da
reversed()
função e mais rápido do que fazer uma cópia da lista e, em seguida, fazer um no localobj.reverse()
. Mas se qualquer um desses métodos é realmente tudo o que você precisa, eles são mais rápidos, mas nunca mais que o dobro da velocidade. Enquanto isso - métodos manuais personalizados podem demorar mais tempo, especialmente em listas muito grandes.Para dimensionar, com uma lista de 1000 itens, a
reversed(<list>)
chamada de função leva ~ 30 ms para configurar o iterador, a reversão no local leva apenas ~ 55 ms, usando o método de fatia leva ~ 210 ms para criar uma cópia da lista completa invertida, mas o método manual mais rápido que fiz levou ~ 8400 ms !!Com 2 itens na lista:
Com 10 itens na lista:
E com 1000 itens na lista:
fonte
Se você deseja armazenar os elementos da lista invertida em alguma outra variável, pode usar
revArray = array[::-1]
ourevArray = list(reversed(array))
.Mas a primeira variante é um pouco mais rápida:
Resultado:
fonte
timeit
.ORGANIZANDO VALORES:
No Python, a ordem das listas também pode ser manipulada com a classificação , organizando suas variáveis em ordem numérica / alfabética:
Temporariamente:
Permanente:
Você pode classificar com a bandeira "reverse = True" :
SEM ORGANIZAÇÃO
Talvez você não queira classificar valores, mas apenas reverter os valores. Então podemos fazer assim:
** Os números têm prioridade sobre o alfabeto na ordem de listagem. A organização dos valores do Python é incrível.
fonte
Usando alguma lógica
Usando alguma lógica da velha escola para praticar para entrevistas.
fonte
Você também pode usar o complemento bit a bit do índice da matriz para percorrer a matriz ao contrário:
Faça o que fizer, não faça dessa maneira.
fonte
Use a compreensão da lista:
fonte
Outra solução seria usar numpy.flip para esse
fonte
A rigor, a questão não é como retornar uma lista ao contrário, mas como reverter uma lista com um exemplo de nome de lista
array
.Para inverter uma lista chamada
"array"
usearray.reverse()
.O método de fatia incrivelmente útil, conforme descrito, também pode ser usado para reverter uma lista no local, definindo a lista como uma modificação fatiada de si mesma usando
array = array[::-1]
.fonte
array[:] = array[::-1]
fonte
Com uma quantidade mínima de funções integradas, assumindo que as configurações da entrevista
fonte
A tradução mais direta de seus requisitos para Python é esta
for
declaração:Isso é um tanto enigmático, mas pode ser útil.
fonte
fonte
//
operador de divisão de piso.Você sempre pode tratar a lista como uma pilha, apenas retirando os elementos da parte superior da pilha no final da lista. Dessa forma, você tira proveito das características first in last out de uma pilha. Claro que você está consumindo a primeira matriz. Eu gosto desse método, pois é bastante intuitivo, pois você vê uma lista sendo consumida no back-end enquanto a outra é criada no front-end.
fonte
fonte
usar
fonte
Aqui está uma maneira de avaliar preguiçosamente o inverso usando um gerador :
Agora repita assim:
Se você precisar de uma lista:
fonte
Existem 3 métodos para obter a lista invertida:
Método de corte 1:
reversed_array = array[-1::-1]
Método de corte 2:
reversed_array2 = array[::-1]
Usando a função interna:
reversed_array = array.reverse()
A terceira função, na verdade, reverteu o objeto da lista no local. Isso significa que nenhuma cópia dos dados originais é mantida. Essa é uma boa abordagem se você não quiser manter a versão antiga. Mas não parece ser uma solução se você deseja a versão original e invertida.
fonte
fonte
l[::-1]
e ao mesmo tempo muito menos legível. A programação funcional em Python é infelizmente bastante lenta.