15 min de leitura
#5 - Listas e Tuplas
Como criar, acessar, modificar e percorrer listas e tuplas em Python, e a diferença fundamental entre essas duas estruturas de dados.
Chegamos nas estruturas de dados de verdade. Esse post cobre duas delas: listas e tuplas. As duas guardam coleções ordenadas de valores e se parecem bastante na sintaxe, mas têm uma diferença fundamental entre si — e é justamente essa diferença que define quando usar cada uma.
Listas
Uma lista é uma coleção ordenada e mutável de itens, criada com colchetes []. Pode misturar tipos de dados diferentes dentro da mesma lista, embora na prática seja mais comum guardar itens do mesmo tipo:
frutas = ["maçã", "banana", "laranja"]
numeros = [1, 2, 3, 4, 5]
misturada = ["Python", 3, True, 3.14]
print(frutas)
print(type(frutas))
['maçã', 'banana', 'laranja']
<class 'list'>
Acessando itens
Igual às strings, os itens de uma lista têm índice começando em 0, e também aceitam índices negativos e slicing:
frutas = ["maçã", "banana", "laranja", "uva", "manga"]
print(frutas[0]) # primeiro item
print(frutas[-1]) # último item
print(frutas[1:3]) # da posição 1 até a 2
print(frutas[:2]) # os dois primeiros
maçã
manga
['banana', 'laranja']
['maçã', 'banana']
Pra verificar se um item está na lista, use o operador in que a gente já viu no post sobre operadores:
print("banana" in frutas)
True
Alterando itens
Diferente das strings, listas são mutáveis — você pode alterar um item existente atribuindo um novo valor pelo índice:
frutas = ["maçã", "banana", "laranja"]
frutas[1] = "morango"
print(frutas)
['maçã', 'morango', 'laranja']
Também dá pra alterar um intervalo inteiro de uma vez, usando slicing na atribuição:
numeros = [1, 2, 3, 4, 5]
numeros[1:3] = [20, 30]
print(numeros)
[1, 20, 30, 4, 5]
Adicionando itens
frutas = ["maçã", "banana"]
frutas.append("laranja") # adiciona no final
print(frutas)
frutas.insert(1, "morango") # insere numa posição específica
print(frutas)
frutas.extend(["uva", "manga"]) # adiciona vários itens de uma vez
print(frutas)
['maçã', 'banana', 'laranja']
['maçã', 'morango', 'banana', 'laranja']
['maçã', 'morango', 'banana', 'laranja', 'uva', 'manga']
Removendo itens
frutas = ["maçã", "banana", "laranja", "uva"]
frutas.remove("banana") # remove pelo valor
print(frutas)
item = frutas.pop() # remove e retorna o último item (ou pelo índice, se passado)
print(item, frutas)
del frutas[0] # remove pelo índice
print(frutas)
frutas.clear() # esvazia a lista inteira
print(frutas)
['maçã', 'laranja', 'uva']
uva ['maçã', 'laranja']
['laranja']
[]
Percorrendo listas com loop
frutas = ["maçã", "banana", "laranja"]
for fruta in frutas:
print(fruta)
maçã
banana
laranja
Se você precisa também do índice de cada item, use enumerate():
for indice, fruta in enumerate(frutas):
print(indice, fruta)
0 maçã
1 banana
2 laranja
List comprehension
List comprehension é uma forma compacta e muito usada em Python de criar uma lista nova a partir de outra, aplicando uma transformação e opcionalmente um filtro, tudo em uma linha só:
numeros = [1, 2, 3, 4, 5, 6]
# forma tradicional, com loop
dobrados = []
for n in numeros:
dobrados.append(n * 2)
# a mesma coisa, com list comprehension
dobrados = [n * 2 for n in numeros]
print(dobrados)
# com um filtro (só os pares)
pares = [n for n in numeros if n % 2 == 0]
print(pares)
[2, 4, 6, 8, 10, 12]
[2, 4, 6]
Ordenando listas
numeros = [5, 2, 8, 1, 9]
numeros.sort() # ordena a própria lista (in place)
print(numeros)
numeros.sort(reverse=True) # ordem decrescente
print(numeros)
nomes = ["Carla", "ana", "Bruno"]
nomes.sort(key=str.lower) # ordena ignorando maiúsculas/minúsculas
print(nomes)
[1, 2, 5, 8, 9]
[9, 8, 5, 2, 1]
['ana', 'Bruno', 'Carla']
Nota:
sort()altera a lista original e não retorna nada (retornaNone). Se você quiser uma lista nova, ordenada, sem mexer na original, use a funçãosorted(lista).
Copiando listas (cuidado com a referência)
Esse é um dos erros mais comuns de quem está começando com Python. Se você faz lista2 = lista1, não está criando uma cópia — as duas variáveis passam a apontar pra mesma lista na memória:
original = [1, 2, 3]
copia_errada = original
copia_errada.append(4)
print(original) # também foi alterada!
print(copia_errada)
[1, 2, 3, 4]
[1, 2, 3, 4]
Pra criar uma cópia de verdade, independente, use o método .copy() ou a função list():
original = [1, 2, 3]
copia = original.copy()
copia.append(4)
print(original) # não foi alterada
print(copia)
[1, 2, 3]
[1, 2, 3, 4]
Juntando listas
lista1 = ["a", "b", "c"]
lista2 = [1, 2, 3]
lista3 = lista1 + lista2 # com o operador +
print(lista3)
lista1.extend(lista2) # com extend(), altera lista1
print(lista1)
['a', 'b', 'c', 1, 2, 3]
['a', 'b', 'c', 1, 2, 3]
Principais métodos de lista
| Método | O que faz |
|---|---|
append(x) |
Adiciona x no final |
insert(i, x) |
Insere x na posição i |
remove(x) |
Remove a primeira ocorrência de x |
pop(i) |
Remove e retorna o item da posição i (padrão: último) |
sort() |
Ordena a lista |
reverse() |
Inverte a ordem dos itens |
count(x) |
Conta quantas vezes x aparece |
index(x) |
Retorna a posição da primeira ocorrência de x |
copy() |
Retorna uma cópia independente da lista |
Tuplas
Uma tupla é praticamente igual a uma lista — coleção ordenada de itens — só que criada com parênteses () e, principalmente, imutável. Depois de criada, você não pode adicionar, remover ou alterar itens diretamente.
cores = ("vermelho", "verde", "azul")
print(cores)
print(type(cores))
('vermelho', 'verde', 'azul')
<class 'tuple'>
Nota: pra criar uma tupla com um único item, é obrigatório colocar a vírgula depois do valor:
(1,). Sem a vírgula,(1)é só o número1entre parênteses, não uma tupla.
Acessando itens
O acesso funciona exatamente igual ao de listas — índice, índice negativo e slicing:
cores = ("vermelho", "verde", "azul", "amarelo")
print(cores[0])
print(cores[-1])
print(cores[1:3])
vermelho
amarelo
('verde', 'azul')
“Atualizando” uma tupla
Como tuplas são imutáveis, não existe um jeito de alterar um item existente. O truque comum pra simular uma atualização é converter a tupla pra lista, alterar a lista, e converter de volta:
cores = ("vermelho", "verde", "azul")
lista_temp = list(cores)
lista_temp[1] = "amarelo"
cores = tuple(lista_temp)
print(cores)
('vermelho', 'amarelo', 'azul')
Você também pode “adicionar” itens concatenando com outra tupla (o que na verdade cria uma tupla nova):
cores = ("vermelho", "verde")
cores = cores + ("azul",)
print(cores)
('vermelho', 'verde', 'azul')
Unpacking (desempacotamento)
Um dos usos mais elegantes de tupla é atribuir seus itens diretamente a várias variáveis de uma vez, na mesma ordem:
coordenada = (10, 20)
x, y = coordenada
print(x)
print(y)
10
20
Se a tupla tiver mais itens do que variáveis, dá pra usar * pra “sobrar” o restante numa lista:
numeros = (1, 2, 3, 4, 5)
primeiro, *meio, ultimo = numeros
print(primeiro)
print(meio)
print(ultimo)
1
[2, 3, 4]
5
Percorrendo tuplas com loop
cores = ("vermelho", "verde", "azul")
for cor in cores:
print(cor)
vermelho
verde
azul
Juntando tuplas
tupla1 = ("a", "b", "c")
tupla2 = (1, 2, 3)
tupla3 = tupla1 + tupla2
print(tupla3)
('a', 'b', 'c', 1, 2, 3)
Principais métodos de tupla
Como tuplas são imutáveis, elas têm bem menos métodos do que listas — só dois, na verdade:
| Método | O que faz |
|---|---|
count(x) |
Conta quantas vezes x aparece |
index(x) |
Retorna a posição da primeira ocorrência de x |
numeros = (1, 2, 2, 3, 2, 4)
print(numeros.count(2))
print(numeros.index(3))
3
3
Lista ou tupla: quando usar cada uma
A diferença central entre as duas é mutabilidade: listas podem ser alteradas depois de criadas, tuplas não. Na prática, isso guia a escolha:
- Use lista quando a coleção vai crescer, encolher ou ter itens alterados ao longo do programa (ex: um carrinho de compras, um histórico que vai sendo preenchido).
- Use tupla quando os dados são fixos e não deveriam mudar (ex: coordenadas
(x, y), os dias da semana, valores de retorno de uma função que sempre tem o mesmo formato). Como bônus, tuplas ocupam menos memória e são um pouco mais rápidas de percorrer do que listas.
E essas são as duas estruturas de dados mais fundamentais do Python pra guardar coleções ordenadas de valores. No próximo post da série, vamos falar de duas outras estruturas de dados essenciais: sets e dicionários.
Fonte adaptada: Python Lists, Python - Access List Items, Python - Change List Items, Python - Add List Items, Python - Remove List Items, Python - Loop Lists, Python - List Comprehension, Python - Sort Lists, Python - Copy Lists, Python - Join Lists, Python List Methods, Python Tuples, Python - Access Tuple Items, Python - Update Tuples, Python - Unpack Tuples, Python - Loop Tuples, Python - Join Tuples, Python Tuple Methods
Comentários