Inverter string e lista

Publicado em 2011-09-26 por Vinicius Assef

Dada uma string, quero mostrá-la invertida. Em python é muito simples.

Indo direto ao ponto:

>>> "12345"[::-1]
'54321'

Como isso é possível?

Uma string pode ser manipulada como uma lista, em Python, usando o operador de slicing ([]), ou, traduzindo, fatiamento. O slicing pode receber 3 parâmetros:

  1. Offset do elemento inicial.

  2. Offset do elemento anterior ao elemento final.

  3. Passo (ou step).

Quando os offsets iniciais e finais são omitidos, o Python entende que você quer a lista toda. Em outras palavras, do primeiro ao último elemento. A "mágica" do exemplo acima é informar um step negativo que, na prática, vai pegar os elementos em ordem inversa.

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 do mesmo jeito do exemplo anterior, mas para cada palavra.

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 manusear strings, veja o post Rapidinha - Strings em Python.

Vinicius Assef

Eu sou apaixonado por Python e shell script.

Aprenda com seus erros e dê nome certo às coisas.