Indexação de Strings¶

Strings são sequências, de forma que podem ser utilizados índices para operar com partes da sequência.

Em Python, ums string como "Olá, João" pode ser representada como na imagem abaixo: string1

Note que há duas indexações possíveis, uma positiva iniciando em 0 (zero) e outra negativa iniciando em -1.

O uso de colchetes [] possibilita operar com partes da string, como exemplificado a seguir.

In [ ]:
# Atribuir uma string à variável s
s = 'Olá meu caro João, hoje é segunda.'
In [ ]:
# Pegar a primeira letra (índice 0)
s[0]   
In [ ]:
# Pegar a terceira letra (índice 2)
s[2]
In [ ]:
# Pegar a última letra (índice -1)
s[-1]
In [ ]:
# Pegar a penúltima letra (índice -2)
s[-2]

Dentro dos colchetes pode ser utilizado o caracter : para definir pedaços da string. Por exemplo: string2

In [ ]:
# Pegar o pedaço que inicia no índice 2 e estende-se até o índice 6
s = "Olá, João"
s[2:7]

Note que o intervalo foi escrito como [2:7] porque em Python o intervalo é fechado no primeiro elemento mas aberto no segundo, ou seja define os índices: 2, 3, 4, 5 e 6.

Note, também, que ao pegar uma letra ou um pedaço de uma string, a string original não é alterada (é imutável)

In [ ]:
# Pegar tudo a partir do índice 2
s[2:]
In [ ]:
# Pegar tudo do início até o índice 6 (exclusivo)
s[:6]
In [ ]:
# Pegar tudo do início até a penúltima letra
s[:-1]
In [ ]:
# Pegar tudo do início ao fim, mas com passo 2, ou seja, somente os índices pares
s[::2]
In [ ]:
# Pegar tudo do início ao fim, mas invertido (com passo -1)
s[::-1]

Percorrimento de strings¶

O comando 'for' pode ser utilizado para percorrer toda uma string ou parte dela, conforme exemplificado abaixo:

In [ ]:
# Percorrer toda a string, caracter a caracter
s = 'Olá, João'
for letra in s:
    print(letra * 5)
In [ ]:
# Percorrer um pedaço da string (tudo exceto as duas últimas letras)
for letra in s[:-2]:
    print(letra)

Operador de pertinência¶

Em Python há o operador in que permite verificar se um elemento pertence a uma sequência.

In [ ]:
# Verificar se uma determinada letra está na string
frase = "João e Maria"
'Mar' in frase
In [ ]:
# Verificar se uma palavra NÃO está na string
if 'José' not in frase:
    print("José não está na frase")

Métodos da classe 'str'¶

Em Python strings são objetos, os quais são exemplares da class "str". Nesta classe são definidos métodos (ações) que podem ser executadas por strings, os quais assumem a forma geral:

object.método(parâmetros)

Abaixo estão alguns exemplos de métodos sobre strings:

In [ ]:
s = "Olá, João Carlos"
type(s)
In [ ]:
# Obter uma nova string que é cópia da anterior porém com todas as letras transformadas para maiúsculas
print(s.upper())
print(s)

# Note que é gerada uma nova string, sendo que a original não é alterada
In [ ]:
# Obter uma nova string em letras minúsculas
s.lower()
In [ ]:
# Dividir uma string em pedaços (por padrão o critério de divisão é caracter em branco)
s.split()
In [ ]:
# Dividir uma string em pedaços, utilizando o caracter ',' como critério de divisão
s.split(',')
In [ ]:
# Contar o número de ocorrências de uma letra
s.count('O')
In [ ]:
# Contar o número de ocorrências não sobrepostas
frase = "O carro atropelou o carcará"
frase.count('car')
In [ ]:
# Contar o número de ocorrências não sobrepostas de uma posição até outra
frase.count('car', 8, 24)
In [ ]:
# Localizar uma substring: retorna o índice
frase.index('car')
In [ ]:
# Remover caracteres no início e no final de uma string
# Por padrão são removidos espaços em branco
palavra = "  Hoje é dia de festa    "
palavra.strip()
In [ ]:
# Remover caracteres no início e no final de uma string
palavra.strip('H a')
In [ ]:
# Substituir uma string por outra
frase.replace('car', 'zzz')
In [ ]:
# Substituir uma string por string vazia (equivale a excluir)
frase.replace('car', '')

# Lembrar que é gerada uma nova string e que a original não é alterada (imutável)
In [ ]:
# Verifica se todos os caracteres da string são dígitos numéricos

str = "123456";
print(str.isdigit()) 
In [ ]:
# Verifica se todos os caracteres da string são letras

str = "Abracadabra";
print(str.isalpha()) 
In [ ]:
# Verifica se todos os caracteres da string são dígitos numéricos ou letras

str = "Abc123";
print(str.isalnum()) 

Há diversos outros métodos definidos na classe 'str' que não estão descritos aqui. Para conhecê-los, veja a documentação da classe 'str'.

Comparar strings¶

In [ ]:
# Verificar se duas strings são iguais
"João" == "Joao"
In [ ]:
# Verificar se duas strings são diferentes
"João Carlos" != "José Carlos"
In [ ]:
# Comparar duas strings desconsiderando a diferença entre letras maiúsculas e minúsculas
p1 = 'Cachorro'
p2 = 'cachorro'

# A comparação falha uma vez que as duas strings não são iguais (diferem na primeira letra)
p1 == p2
In [ ]:
# Comparar as duas strings após convertê-las para letras maiúsculas
p1.upper() == p2.upper()

Note que os sinais diacríticos (acento agudo, acento circunflexo, til, etc) impactam no resultado da comparação de strings.

Os nomes "Antonio" e "Antônio", por exemplo, são diferentes uma vez o valor decimal correspondente ao caracter 'o' difere do valor do caracter 'ô'

In [1]:
# Valor numérico do caracter 'o'
ord('o')
Out[1]:
111
In [2]:
# Valor numérico do caracter 'ô'
ord('ô')
Out[2]:
244
In [ ]:
# As duas strings abaixo são diferentes
"Antonio" != "Antônio"

Em ordem lexicográfica (ordem alfabética) o nome "Maria das Dores" vem antes do nome "Maria do Rosário"

In [ ]:
# Verificar quem vem antes em ordem lexicográfica (ordem alfabética)
"Maria das Dores" < "Maria do Rosário"

De forma similar, o nome "João" deveria vir antes do nome "José". Contudo, esta comparação falha uma vez que o valor decimal do caracter 'ã' é maior que o valor do caracter 's'

In [ ]:
# Valor numérico do caracter 'ã'
ord('ã')
In [ ]:
# Valor numérico do caracter 's'
ord('s')
In [ ]:
# A expressão abaixo falha
"João Carlos" < "José Carlos"

Exercícios resolvidos¶

In [ ]:
# Inverter o sobrenome com o nome (padrão de listas de telefones)
# "João Carlos de Oliveira" => "Oliveira, João Carlos de"

nome = "João Carlos de Oliveira"

ind = nome.rindex(' ')        # encontra o índice do último espaço em branco (antes de Oliveira)
sobrenome = nome[ind+1:]      # separa o sobrenome (após o último branco até o final)
primeiro_nome = nome[:ind]    # separa o nome (do início até o caracter anterior ao último espaço em branco)
nome_lista_telefonica = sobrenome + ", " + primeiro_nome # concatena as partes, invertendo a ordem
print(nome_lista_telefonica)
In [ ]:
# Verifica se um string lido representa um número binário (formado apenas por dígitos 0 ou 1)
# "101100" => True
# "11031"  => False

numero = input()  # lê o número (supostamente binário) na forma de um string
eh_binario = True # Supõe, por hipótese, que trata-se de um número binário.
                  # Em seguida tenta refutar a hipótese, ou seja, procurar um caracter que não seja um dígito binário
for caracter in numero:  # percorre os caracteres do número, um a um
    if caracter != '0' and caracter != '1':   # Testa a condição que refuta a hipótese inicial, ou seja,
                                              # verifica se o caracter não é um dígito binário
        eh_binario = False # Nega a hipótese inicial
        break              # Para o processo de repetiçao "for" uma vez que não é necessário testar os demais caracteres

print(eh_binario)
In [ ]:
# Uma segunda forma de resolver o problema anterior é contar quantas vezes aparecem os caracteres '0' e '1' no número
# e comparar a soma das contagens com o total de caracteres. Se forem iguais, então o número é binário

numero = input()  # lê o número (supostamente binário) na forma de um string
eh_binario = numero.count('0') + numero.count('1') == len(numero)
print(eh_binario)
In [ ]:
# Verificar se uma frase é palíndromo (lida igual de trás para frente)

frase = "Socorram-me, subi no onibus em marrocos."

frase_limpa = '' # armazena apenas as letras; os demais caracteres são descartados
for caracter in frase.lower():     # percorre a frase caracter a caracter, já toda em letras minúsculas
    if caracter.isalpha():         # se o caracter for uma letra, concatena na frase limpa
        frase_limpa += caracter

print(frase_limpa == frase_limpa[::-1]) # compara a frase com ela invertida para ver se são iguais
In [ ]:
# Verificar se as letras de um string estão todas em ordem crescente
# "adffgz" => True
# "dgahbz" => False

# A estratégia adotada é a de percorrer as letras uma a uma a partir da segunda
# e comparar cada letra com a anterior para ver se elas estão na ordem correta

sequencia = input()  # lê a sequência de letras
esta_ordenada = True # supõe, por hipótese, que as letras estão ordenadas e em seguida tenta refutar esta hipótese
for i in range(1, len(sequencia)): # a variável i será utilizada para indexar cada letra, começando na segunda
    if sequencia[i] < sequencia[i-1]: # compara uma letra (índice i) com sua anterior (índice i-1)
                                      # se a condição é verdadeira significa que não está na ordem e, portanto,
                                      # a hipótese inicial é falsa
        esta_ordenada = False       # refuta a hipótese inicial
        break                       # para o processo pois não é necessário continuar a verificação