>>> 'eu gosto de python'[::-1] 'nohtyp ed otsog ue'
E se eu quiser inverter palavra por palavra, mas mantendo a ordem em que as palavras aparecem no texto?
>>> ' '.join([word[::-1] for word in 'eu gosto de python'.split()]) 'ue otsog ed nohtyp'
A dica aqui é usar o slicing de um jeito não muito comum: com o argumento
step (o número -1, no exemplo), que indica o salto que será utilizado para selecionar os itens da sequência em questão.Vejamos um exemplo bem simples:
>>> lista = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50] >>> print lista[::2] [5, 15, 25, 35, 45]
Entendeu? Agora, vamos ver o efeito do
step negativo, igual ao que usamos na inversão de string:>>> lista = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50] >>> print lista[::-1] [50, 45, 40, 35, 30, 25, 20, 15, 10, 5]
E que tal ver os mesmos exemplos escritos do jeito normal, a fim de clarear o entendimento?
>>> resultado = '' >>> for letra in 'eu gosto de python': ... resultado = letra + resultado ... >>> resultado 'nohtyp ed otsog ue'
Agora, vamos ao segundo exemplo:
>>> resultado = [] ... for palavra in 'eu gosto de python'.split(): ... temp = '' ... for letra in palavra: ... temp = letra + temp ... resultado.append(temp) ... >>> ' '.join(resultado) 'ue otsog ed nohtyp'
Existem outras formas de fazer o mesmo em Python. Uma delas seria usar o
enumerate() para pegar o índice de cada letra e classificar em ordem decrescente de índice a lista de tuplas obtida. Mas "Simple is better than complex."
Interessante.
ResponderExcluirUma correção, no penúltimo snipet de codigo, na terceira linha, devia ser: resultado = letra + resultado
Uma outra alternativa, talvez mais eficiente, ao uso de slice com passo negativo, é o uso da função builtin 'reversed', que toma um iterável como parâmetro e retorna um iterável sobre a ordem reversa dos elementos. Então, isso também funciona: ''.join(reversed('eu gosto de python'))
André Vitor, obrigado. Exemplo corrigido.
ResponderExcluir