reversão corda compreensão via slicing
Pergunta
Eu estava procurando por uma forma de imprimir uma corda para trás, e depois de uma rápida pesquisa no google, eu encontrei este método:
a
Suponha que é uma variável de cadeia. Isso irá retornar a string a
para trás:
a[::-1]
Alguém pode explicar como isso funciona?
Solução
Claro, o [::]
é a estendida operador de fatia . Ele permite que você tire substrings. Basicamente, ele funciona, especificando quais os elementos que você quer como [começar: fim: passo], e ele funciona para todas as sequências. Duas coisas legais sobre ele:
- Você pode omitir um ou mais dos elementos e ele faz "a coisa certa"
- Os números negativos para início, fim e passo têm significado
Para começar e terminar, se você der um número negativo, isso significa a contar a partir do fim da sequência. Por exemplo, se eu tenho uma lista:
l = [1,2,3]
Então l[-1]
é 3, l[-2]
é 2, e l[-3]
é 1.
Para o argumento step
, um meio número negativo para o trabalho para trás através da sequência. Assim, para uma lista ::
l = [1,2,3,4,5,6,7,8,9,10]
Você poderia escrever l[::-1]
o que significa, basicamente, para usar um tamanho de passo de -1, enquanto a leitura através da lista. Python irá "fazer a coisa certa" ao preencher a iniciar e parar assim que itera através da lista para trás e dá-lhe [10,9,8,7,6,5,4,3,2,1]
.
Eu dei os exemplos com listas, mas cordas são apenas uma outra sequência e funcionam da mesma maneira. Assim meios a[::-1]
para construir uma corda, unindo os caracteres que você começa a andar para trás através do string.
Outras dicas
O "-1" parte representa a parte do "passo" da operação de corte, neste caso, que atravessa a cadeia de caracteres 1 de cada vez, mas para trás (um meio passo negativos começar a partir do fim da cadeia). Se você especificar o passo para ser 2, por exemplo, você deseja obter todos os outros caracteres da string, começando com o primeiro. Se você especificar um passo de -2, então você deseja obter qualquer outro caractere da string, começando com o último caractere e para trás trabalhar.
Assim, em poucas palavras, se a = '12345'
:
-
a[::2]
se torna135
-
a[::-1]
se torna54321
-
a[::-2]
se torna531
Eu acho o seguinte faz um pouco mais de sentido para seqüências de impressão na ordem inversa, mas talvez isso é só comigo:
for char in reversed( myString ):
print( char, end = "" )
É a estendida notação fatia :
sequence[start:end:step]
Neste caso, o passo -1 significa para trás, e omitindo os meios de início e fim que você quer toda a string.
É chamado Slice Notation em Python e você pode ler um pouco mais de como ele funciona aqui:
É usando corte prolongado - uma string é uma seqüência em Python, e compartilha alguns métodos com outras seqüências (ou seja, listas e tuplas). Há três partes para cortar - iniciar, parar e passo. Todos eles têm valores padrão - iniciar o padrão é 0, o padrão stop para len (seqüência), e defaults passo para 1. Ao especificar [:: - 1] você está dizendo "todos os elementos na sequência de um, a partir do início , até o final indo um para trás de uma vez.
Este recurso foi introduzido em Python 2.3.5, e você pode ler mais no O que há de novo docs .
[:: - 1] dá uma fatia da string a. a sintaxe completa é a[begin:end:step]
o que dá uma [begin], a [começam + passo], ... um [end-1]. Quando passo é negativo, você começa no final e passar para começar.
Finalmente, começam padrões para o início da sequência, a extremidade a extremidade, e passo a -1.
Eu faria isso como este:
variable = "string"
message = ""
for b in variable:
message = b+message
print (message)
e imprime: gnirts
Uma cadeia é essencialmente uma sequência de caracteres e assim a operação de corte trabalha nele. O que você está fazendo é de fato:
-> obter uma fatia de 'a' do início ao fim em passos de 1 para trás
.É notação básica etapa, considere a funcionalidade:
a [2: 4: 2]
O que acontece é que o índice é cortado entre a posição 2 e 4, que a terceira variável faz é que define o tamanho do passo a partir do primeiro valor. Neste caso, seria um regresso [2], uma vez que uma [4] é um limites superiores apenas dois valores são retorno e não segundo passo tem lugar. O (-). Operador de subtração simplesmente inverte a saída passo
Considere a lista abaixo
l=[12,23,345,456,67,7,945,467]
Outro truque para reverter uma lista podem ser:
l[len(l):-len(l)-1:-1] [467, 945, 7, 67, 456, 345, 23, 12]
l[:-len(l)-1:-1] [467, 945, 7, 67, 456, 345, 23, 12]
l[len(l)::-1] [467, 945, 7, 67, 456, 345, 23, 12]
podemos usar append e pop para fazê-lo
def rev(s):
i = list(s)
o = list()
while len(i) > 0:
o.append(t.pop())
return ''.join(o)
Sem usar revertida ou [:: - 1], aqui está uma versão simples baseado em recursão eu considero ser o mais legível:
def reverse(s):
if len(s)==2:
return s[-1] + s[0]
if len(s)==1:
return s[0]
return s[-1] + reverse(s[1:len(s)-1]) + s[0]
Usando fatia estendido sintaxe
word = input ("Type a word which you want to reverse: ")
def reverse(word):
word = word[::-1]
return word
print (reverse(word))
Você pode usar invertida () função. Por exemplo
x = "abcd"
for i in reversed(x):
print(i, end="")
print("\n")
L = [1,2,3]
for i in reversed(L):
print(i, end="")
impressões dcba
e 321
o primeiro dois limites padrão para 0 eo comprimento da seqüência, como antes, e um passo de -1 indica que a fatia deve ir da direita para a esquerda em vez de à esquerda de costume para a direita. O efeito, portanto, é de inverter a sequência.
name="ravi"
print(name[::-1]) #ivar