26 de setembro de 2011

Inverter strings

Dada uma string, quero mostrá-la invertida. Em python é muito simples.
>>> '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."

Para mais dicas de como lidar com strings, veja o post Rapidinha - Strings em Python.

Eu sou Vinicius Assef, um programador do século passado que gosta de Python, pratica Lean Development e acredita em Deus. Você pode me contactar por email ou twitter.

5 comentários:

  1. Interessante.
    Uma 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'))

    ResponderExcluir
  2. André Vitor, obrigado. Exemplo corrigido.

    ResponderExcluir
  3. De qualquer forma, gostei pois foi pythônico!

    ResponderExcluir

Marcadores