Não há reverse
função integrada para o str
objeto do Python . Qual é a melhor maneira de implementar esse método?
Se você fornecer uma resposta muito concisa, descreva sua eficiência. Por exemplo, se o str
objeto é convertido em um objeto diferente etc.
Respostas:
E se:
Essa é a sintaxe de fatia estendida . Isso funciona
[begin:end:step]
- deixando start e end off e especificando uma etapa de -1, ela reverte uma string.fonte
b = a.decode('utf8')[::-1].encode('utf8')
mas obrigado pela direção certa!.decode('utf8')
for necessário, significaa
que não contém nenhum objeto de string, e sim bytes.@ Paolo
s[::-1]
é o mais rápido; é uma abordagem mais lenta (talvez mais legível, mas discutível)''.join(reversed(s))
.fonte
join
tem que criar a lista de qualquer maneira para poder obter o tamanho.''.join(list(reversed(s)))
pode ser um pouco mais rápido.Minha própria experiência com essa questão é acadêmica. No entanto, se você é um profissional que procura a resposta rápida, use uma fatia que segue
-1
:ou mais legível (mas mais lento devido às pesquisas de nome método e o fato de que se juntam formas uma lista quando dado um iterator),
str.join
:ou para legibilidade e reutilização, coloque a fatia em uma função
e depois:
Explicação mais longa
Se você estiver interessado na exposição acadêmica, continue lendo.
Aqui estão algumas coisas sobre as strings do Python que você deve saber:
No Python, as strings são imutáveis . Alterar uma sequência não modifica a sequência. Cria um novo.
Strings são cortáveis. Cortar uma corda fornece uma nova corda de um ponto na corda, para trás ou para a frente, para outro ponto, por determinados incrementos. Eles recebem notação de fatia ou um objeto de fatia em um subscrito:
O subscrito cria uma fatia incluindo dois pontos nos chavetas:
Para criar uma fatia fora dos aparelhos, você precisará criar um objeto de fatia:
Uma abordagem legível:
Embora
''.join(reversed('foo'))
seja legível, é necessário chamar um método stringstr.join
, em outra função chamada, que pode ser relativamente lenta. Vamos colocar isso em uma função - retornaremos a ela:Abordagem de melhor desempenho:
Muito mais rápido é usar uma fatia reversa:
Mas como podemos tornar isso mais legível e compreensível para alguém menos familiarizado com fatias ou com a intenção do autor original? Vamos criar um objeto de fatia fora da notação subscrita, dar um nome descritivo e passá-lo para a notação subscrita.
Implementar como função
Para realmente implementar isso como uma função, acho que é semanticamente claro o suficiente para simplesmente usar um nome descritivo:
E o uso é simplesmente:
O que seu professor provavelmente quer:
Se você tem um instrutor, eles provavelmente querem que você comece com uma string vazia e crie uma nova string a partir da antiga. Você pode fazer isso com sintaxe pura e literais usando um loop while:
Teoricamente, isso é ruim porque, lembre-se, as strings são imutáveis - então toda vez que parece que você está adicionando um personagem ao seu
new_string
, é teoricamente que você cria uma nova string toda vez! No entanto, o CPython sabe como otimizar isso em certos casos, dos quais esse caso trivial é um deles.Melhor prática
Teoricamente melhor é coletar suas substrings em uma lista e juntá-las mais tarde:
No entanto, como veremos nos intervalos abaixo para CPython, isso realmente leva mais tempo, porque o CPython pode otimizar a concatenação de cadeias.
Horários
Aqui estão os horários:
O CPython otimiza a concatenação de cadeias, enquanto outras implementações podem não :
fonte
while
e diminuindo o índice, embora talvez isso é menos legível:for i in range(len(a_string)-1, -1, -1):
. Acima de tudo o amor I que a cadeia exemplo que você escolheu é o caso onde você nunca iria precisar revertê-la, e não seria capaz de dizer se você teve :)Resposta Rápida (TL; DR)
Exemplo
Resposta detalhada
fundo
Esta resposta é fornecida para resolver a seguinte preocupação do @odigity:
Problema
Solução
Armadilhas
string.reverse()
string.reverse()
para evitar a notação de fatia.print 'coup_ate_grouping'[-4:] ## => 'ping'
print 'coup_ate_grouping'[-4:-1] ## => 'pin'
print 'coup_ate_grouping'[-1] ## => 'g'
[-1]
podem afastar alguns desenvolvedoresFundamentação
O Python tem uma circunstância especial a ser observada: uma string é um tipo iterável .
Uma justificativa para excluir um
string.reverse()
método é incentivar os desenvolvedores de python a aproveitar o poder dessa circunstância especial.Em termos simplificados, isso significa simplesmente que cada caractere individual de uma string pode ser facilmente operado como parte de um arranjo seqüencial de elementos, assim como matrizes em outras linguagens de programação.
Para entender como isso funciona, revisar example02 pode fornecer uma boa visão geral.
Exemplo02
Conclusão
A carga cognitiva associada à compreensão de como a notação de fatia funciona em python pode realmente ser demais para alguns adotantes e desenvolvedores que não desejam investir muito tempo aprendendo a linguagem.
No entanto, uma vez entendidos os princípios básicos, o poder dessa abordagem sobre os métodos de manipulação de cordas fixas pode ser bastante favorável.
Para aqueles que pensam o contrário, existem abordagens alternativas, como funções lambda, iteradores ou declarações simples de funções pontuais.
Se desejado, um desenvolvedor pode implementar seu próprio método string.reverse (), no entanto, é bom entender a lógica por trás desse aspecto do python.
Veja também
fonte
As respostas existentes estão corretas apenas se os clusters Unicode Modifiers / grafema forem ignorados. Lidarei com isso mais tarde, mas primeiro observe a velocidade de alguns algoritmos de reversão:
Você pode ver que o tempo para a compreensão da lista (
reversed = string[::-1]
) é em todos os casos de longe o mais baixo (mesmo depois de corrigir meu erro de digitação).Reversão de String
Se você realmente deseja reverter uma string no senso comum, é MUITO mais complicado. Por exemplo, pegue a seguinte corda ( dedo marrom apontando para a esquerda , dedo amarelo apontando para cima ). Esses são dois grafemas, mas três pontos de código unicode. O adicional é um modificador de capa .
Mas se você o reverter com qualquer um dos métodos fornecidos, o dedo marrom será apontado para cima , o dedo amarelo apontado para a esquerda . A razão para isso é que o modificador de cor "marrom" ainda está no meio e é aplicado ao que estiver antes dele. Então nós temos
e
Os Clusters Unicode Grapheme são um pouco mais complicados do que apenas pontos de código modificadores. Felizmente, existe uma biblioteca para lidar com grafemas :
e, portanto, a resposta correta seria
que também é de longe o mais lento:
O código
fonte
1. usando notação de fatia
2. usando a função reversed ()
3. usando recursão
fonte
RecursionError: maximum recursion depth exceeded while calling a Python object
. Ex:rev_string("abcdef"*1000)
Uma maneira menos desconcertante de ver isso seria:
Em inglês [-1 :: - 1], lê-se como:
fonte
-1
ainda está desnecessários, no entanto.Inverta uma string em python sem usar reversed () ou [:: - 1]
fonte
Esta também é uma maneira interessante:
ou similar:
Outra maneira mais 'exótica' de usar byterarray que suporta .reverse ()
vai produzir:
fonte
fonte
fonte
Isso funciona fazendo um loop através de uma string e atribuindo seus valores na ordem inversa a outra string.
fonte
Aqui não é chique:
fonte
Aqui está um sem
[::-1]
oureversed
(para fins de aprendizado):você pode usar
+=
para concatenar seqüências de caracteres, masjoin()
é mais rápido.fonte
Método recursivo:
exemplo:
fonte
Todas as soluções acima são perfeitas, mas se estivermos tentando reverter uma string usando o loop for em python se tornará um pouco complicado, então aqui está como podemos reverter uma string usando o loop for
Espero que este seja útil para alguém.
fonte
Esse é meu caminho:
fonte
Existem várias maneiras de reverter uma string, mas também criei outra apenas por diversão. Eu acho que essa abordagem não é tão ruim assim.
fonte
Esta classe usa funções mágicas python para reverter uma string:
Resultado
Referência
fonte
Com o python 3, você pode reverter a string no local, o que significa que ela não será atribuída a outra variável. Primeiro você precisa converter a string em uma lista e depois alavancar a
reverse()
função.https://docs.python.org/3/tutorial/datastructures.html
fonte
Esta é uma função reversa simples e significativa, fácil de entender e codificar
fonte
Aqui está simplesmente:
imprimir "loremipsum" [- 1 :: - 1]
e alguns logicamente:
resultado:
muspimerol
fonte
Inverta uma string sem magia python.
fonte
Claro, em Python você pode fazer coisas de uma linha muito chiques. :)
Aqui está uma solução simples e completa que pode funcionar em qualquer linguagem de programação.
fonte
RESULTADO :
fonte
Você pode usar a função invertida com uma lista abrangente. Mas não entendo por que esse método foi eliminado no python 3, foi desnecessário.
fonte
.join
ou algo para torná-lo uma resposta válida[c for c in string]
é o mesmolist(string)
.