Listas e strings
Table of Contents
1. Introdução
As cadeias de caracteres (strings) são coleções de caracteres organizadas de forma sequencial. Há diversas situações em que é útil organizarmos dados (não apenas caracteres) de forma sequencial, para isso, o Python oferece as listas.
2. Listas
Uma lista em Python pode ser definida com a seguinte sintaxe.
lista = [10, 20, 30, 40, 50]
Em Python, as listas são heterogêneas, isto é, seus elementos podem ser de tipos de dados diferentes (strings, inteiros e números em ponto-flutante, por exemplo).
lista = [10, 'dez', 10.0]
2.1. Operações sobre listas
2.1.1. Imprimindo uma lista
lista = [10, 'dez', 10.0] print(lista)
2.1.2. O comprimento de uma lista
A função len retorna o comprimento de uma lista.
lista = [10, 'dez', 10.0] x = len(lista) print(x)
2.1.3. Acessando um elemento de uma lista
Devido à organização sequencial de listas, é possível acessar um elemento da lista baseado em sua posição (primeiro, segundo, terceiro etc). O primeiro elemento está na posição \(0\) (zero), o segundo na posição \(1\) e assim por diante.
Em Python, as listas começam a partir da posição \(0\). Algumas linguagens de programação utilizam índices começando na posição \(1\) (Fortran, Octave e Julia, por exemplo). Uma carta de Edsger Dijkstra sobre a discussão está disponível neste link.
A posição do elemento que se deseja acessar é indicada utilizando colchetes (vide exemplo a seguir)
lista = [10, 'dez', 10.0] print(lista[0])
Na implementação de algoritmos é importante ser cuidadoso para não acessar posições inexistentes das listas.
Descomente as linhas do código a seguir, uma por vez, e execute o código. Verifique o que é impresso.
lista = [10, 20, 30, 40, 50] #print(lista[0]) #print(lista[3]) #print(lista[4]) #print(lista[-1]) #print(lista[-2]) #print(lista[len(lista)]) #print(lista[5])
2.1.4. Adicionando um elemento em uma lista
Para adicionar elementos a listas pode-se utilizar o método insert
,
que recebe a posição de inserção e o elemento a ser inserido.
lista = [20, 30] lista.insert(0, 10) print(lista)
Utilizando a função insert
, faça um programa que define uma lista vazia \(L\) e insere números inteiros
positivos, fornecidos pelo usuário, na última posição de \(L\) até que
seja fornecido o número \(-1\).
A operação de inserir elementos na última posição de uma lista é
bastante frequente. Nesses casos, uma opção ao método insert
é o
método append
que insere diretamente na última posição.
Altere o código do exercício anterior para utilizar o método append
2.1.5. Removendo um elemento de uma lista
Há pelo duas opções de remoção, em algumas situações é necessário
remover um elemento baseado em sua posição e em outras baseado no
conteúdo. Para remover baseado na posição, pode-se utilizar o método
pop
.
lista = [10, 20, 30, 40, 50] x = lista.pop(1) print(f"Elemento removido {x}") print(lista)
Implemente um código que lê números positivos do usuário até que seja digitado \(-1\), armazene-os em uma lista, e então remova os elementos um a um da lista, cada elemento removido deve ser impresso para o usuário. Os elementos devem ser removidos na mesma ordem em que foram adicionados na lista.
Utilizando a remoção baseada na posição, implemente um código que define uma lista \(L\) com números inteiros positivos, pede ao usuário um valor e então remove aquele valor da lista (se o valor estiver na lista), caso contrário, o código deve imprimir uma mensagem avisando que o valor não está na lista.
Além da remoção baseada na posição, pode-se remover elementos baseado
no conteúdo. Para isso, pode-se utilizar o método remove
.
lista = [10, 20, 30, 40, 50] lista.remove(20) print(lista)
Verifique o que acontece caso o argumento do método remove
não
esteja presente na lista.
2.2. Verificando se um elemento está na lista
Uma forma de verificar se um elemento está em uma lista é usando o
operador in
como no trecho a seguir.
x = int(input("Digite um valor: ")) L = [12, 5, 2, 50, 10] if x in L: print(f"{x} presente") else: print(f"{x} ausente")
2.3. Outros métodos relacionados a listas
sort
.count
.index
.clear
.reverse
.copy
.max
.min
.del
.
Pesquisa sobre cada um dos métodos anteriores e faça um exemplo para entender os respectivos comportamentos.
3. Listas, laços e break
É frequente precisarmos iterar sobre listas, isto é, percorrer listas
elemento a elemento para verificar uma propriedade. É possível
percorrer listas tanto com laços do tipo while
quanto do tipo
for
. Por exemplo, para imprimir uma lista elemento a elemento com
laço while
, tem-se o seguinte.
lista = [10, 20, 30, 40, 50] i = 0 while i < len(lista): print(lista[i]) i += 1 # i = i + 1
Note que, neste caso é necessário controlar o índice do elemento com a
variável i
. Muitas vezes, no entanto, o índice do elemento é
secundário e o interesse principal é no elemento em si. Nesses casos,
um laço for
costuma ser mais conveniente.
lista = [10, 20, 30, 40, 50] for item in lista: print(item)
3.1. Interrompendo um laço
Considere a situação em que foi definida uma coleção de valores em uma lista e é necessário encontrar a posição de um valor nesta lista. Uma possível implementação é a seguinte.
valores = [10, 20, 30, 40, 50] alvo = 30 alvopos = -1 i = 0 while i < len(valores): if valores[i] == alvo: alvopos = i i += 1 if (alvopos >= 0): print(f"Valor {alvo} na posicao {alvopos}") else: print("Alvo nao encontrado")
Note que, uma vez que o valor já tenha sido encontrado, não é mais
necessário realizar o laço. Nesse caso, podemos utilizar o comando
break
para parar sair do laço. Com o comando break
o código pode
ser alterado para o seguinte.
valores = [10, 20, 30, 40, 50] alvo = 30 i = 0 while i < len(valores): if valores[i] == alvo: break i += 1 if (i < len(valores)): print(f"Valor {alvo} na posicao {i}") else: print("Alvo nao encontrado")
O comando break
sempre finaliza o laço mais interno e, embora seja
bastante útil, deve ser utilizado apenas quando necessário, pois pode
dificultar o entendimento do código. Isso pelo fato de cada comando
break
desviar o fluxo natural do laço.
Pesquise sobre o comando continue
e compare-o com o comando break
4. Strings e alguns métodos
Uma string pode ser vista como uma sequência de caracteres. Diversas funções aplicadas a listas também podem ser aplicadas a strings.
Verifique o que é impresso pelos comandos a seguir.
palavra = "Teste" print(len(palavra)) print(palavra[0]) print(palavra[-1])
Strings também são objetos iteráveis. Portanto, é possível
combiná-las com laços for
da seguinte forma.
palavra = "Teste" for c in palavra: print(c)
4.1. Os métodos split e strip
A manipulação de strings é importante em diversos contextos, um deles é o fato do retorno da função input ser uma string. Dois desses métodos são o split e o strip.
O método split separa as diversas as diversas palavras de uma frase em uma lista.
palavra = "Essa e' uma frase" print(palavra.split())
O método split considera que o espaço é o separador padrão, mas é possível escolher outros separadores, basta fornecê-los como argumento do método.
numeros = "1,2,3,4,5" print(numeros.split(','))
O método strip auxilia na remoção de caracteres indesejados no início e final da string (como espaços).
palavra = " teste " print(palavra.strip())
5. Fatiamento de listas
Em algumas situações é interessante trabalhar com "fatias" (pedaços) da uma lista. O fatiamento de listas pode ser realizado utilizando a seguinte sintaxe.
L[start:end:step]
Os elementos start
e end
identificam respectivamente o começo e
final da fatia de interesse. O elemento step
pode ser omitido e será
detalhado mais adiante. Como exemplo, considere o seguinte código.
L = [10, 20, 30, 40, 50, 60, 70, 80] print(L[2:6])
Note que será impressa a fatia [30, 40, 50, 60]
. No caso do elemento
step
não ser fornecido, a fatia recortada é contínua. Se for
necessário, o elemento step
pode ser especificado para que sejam
pulados elementos periodicamente.
L = [10, 20, 30, 40, 50, 60, 70, 80] print(L[2:6:2]) # Imprime [30, 50]
Determine o que será impresso pelo código a seguir e, em seguida, implemente o código para conferir sua resposta.
L = range(1, 100) print(L[10:20]) print(L[10:10]) print(L[1:100]) print(L[100:0:-1]) print(L[100:-1:-1]) print(L[100::-1]) print(L[::-1])
6. Listas de listas de listas de listas…
Os elementos de uma lista podem ser outras listas.
L = [ [1, 2, 3], [3, 4], [6], []]
Uma das grandes utilidades desse raciocínio é a possibilidade de
representar estruturas de dados matriciais em um código. Por exemplo,
o script a seguir define duas matrizes A
e B
e realiza a soma
matricial \(A+B\), guardando o resultado na própria lista A
.
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] B = [[2, 3, 2], [-1, -1, -1], [0, 2, 1]] for i in range(len(A)): for j in range(len(A[0])): A[i][j] += B[i][j]
Esse mesmo raciocínio pode ser utilizado para matrizes multidimensionais (listas de listas de listas…)
7. Referências e outros materiais
- Payne, James R. Python for Teenagers: Learn to Program Like a Superhero!. Apress, 2019.