Python oferece mais de uma forma de agrupar dados. Enquanto listas são flexíveis e mutáveis, existem situações em que você precisa de coleções que não mudam — ou que garantam que não haja valores duplicados. Para isso existem as tuplas e os sets.
Tuplas
Uma tupla é uma sequência imutável de valores. Uma vez criada, não pode ser alterada — nenhum elemento pode ser adicionado, removido ou modificado.
coordenadas = (10.5, -23.4)
rgb = (255, 128, 0)
pessoa = ("Ricardo", 35, "São Paulo")
# Também pode ser criada sem parênteses
ponto = 4.0, 9.0
print(type(coordenadas)) # <class 'tuple'>
Acessando elementos
O acesso é idêntico ao de listas — índices e fatiamento funcionam normalmente:
pessoa = ("Ricardo", 35, "São Paulo")
print(pessoa[0]) # Ricardo
print(pessoa[-1]) # São Paulo
print(pessoa[1:]) # (35, 'São Paulo')
Por que usar tuplas?
A imutabilidade não é uma limitação — é uma garantia. Tuplas comunicam ao leitor do código que aquele conjunto de dados não deve mudar. Além disso:
- São mais rápidas que listas em iteração
- Podem ser usadas como chaves de dicionário (listas não podem)
- Protegem dados que não devem ser modificados acidentalmente
# Tupla como chave de dicionário — válido
localizacoes = {
(40.7128, -74.0060): "Nova York",
(-23.5505, -46.6333): "São Paulo",
}
# Lista como chave — gera TypeError
# {[1, 2]: "valor"} # ERRO
Desempacotamento
Uma das operações mais elegantes com tuplas:
pessoa = ("Ana", 28, "Recife")
nome, idade, cidade = pessoa
print(nome) # Ana
print(idade) # 28
# Ignorando valores com _
primeiro, _, ultimo = (1, 2, 3)
print(primeiro, ultimo) # 1 3
# Capturando o restante com *
a, *resto = (1, 2, 3, 4, 5)
print(a) # 1
print(resto) # [2, 3, 4, 5]
Tupla com um único elemento
Um erro comum ao criar tuplas de um elemento:
nao_e_tupla = (42) # isso é apenas int com parênteses
e_tupla = (42,) # a vírgula define que é tupla
tambem = 42,
print(type(nao_e_tupla)) # <class 'int'>
print(type(e_tupla)) # <class 'tuple'>
Sets (Conjuntos)
Um set é uma coleção não ordenada e sem elementos duplicados. É baseado na estrutura matemática de conjuntos.
linguagens = {"Python", "JavaScript", "Go", "Python", "Go"}
print(linguagens) # {'JavaScript', 'Go', 'Python'} — duplicatas removidas
numeros = {1, 2, 3, 4, 5}
vazio = set() # não use {} — isso cria um dicionário vazio
Como sets não têm ordem, não suportam indexação:
s = {10, 20, 30}
s[0] # TypeError — sets não têm índice
Operações de Conjunto
A verdadeira força dos sets está nas operações matemáticas:
python_devs = {"Ana", "Bruno", "Carla", "Diego"}
java_devs = {"Bruno", "Diego", "Eduardo", "Flávia"}
# União — todos os elementos de ambos
print(python_devs | java_devs)
# {'Ana', 'Bruno', 'Carla', 'Diego', 'Eduardo', 'Flávia'}
# Interseção — elementos em comum
print(python_devs & java_devs)
# {'Bruno', 'Diego'}
# Diferença — em python_devs mas não em java_devs
print(python_devs - java_devs)
# {'Ana', 'Carla'}
# Diferença simétrica — em um ou outro, mas não em ambos
print(python_devs ^ java_devs)
# {'Ana', 'Carla', 'Eduardo', 'Flávia'}
Métodos de Sets
s = {1, 2, 3}
s.add(4) # adiciona um elemento
s.update([5, 6]) # adiciona múltiplos elementos
s.remove(2) # remove — gera KeyError se não existir
s.discard(99) # remove — silencioso se não existir
print(3 in s) # True — verificação de pertinência (muito eficiente)
print(len(s)) # quantidade de elementos
Verificações de subconjunto
a = {1, 2, 3}
b = {1, 2, 3, 4, 5}
print(a.issubset(b)) # True — a está contido em b
print(b.issuperset(a)) # True — b contém a
print(a.isdisjoint({6, 7})) # True — nenhum elemento em comum
Removendo duplicatas de uma lista
Um uso clássico e elegante de sets:
emails = [
"ana@email.com",
"bruno@email.com",
"ana@email.com",
"carla@email.com",
"bruno@email.com",
]
emails_unicos = list(set(emails))
print(emails_unicos)
# ['carla@email.com', 'ana@email.com', 'bruno@email.com']
Atenção: a conversão para set não preserva a ordem original. Se a ordem importa, use:
from dict import fromkeys # não existe — use o padrão abaixo
emails_unicos = list(dict.fromkeys(emails))
# preserva a ordem de primeira aparição
Comparação: Lista, Tupla e Set
| Característica | Lista | Tupla | Set |
|---|---|---|---|
| Ordenada | ✅ | ✅ | ❌ |
| Mutável | ✅ | ❌ | ✅ |
| Permite duplicatas | ✅ | ✅ | ❌ |
| Indexável | ✅ | ✅ | ❌ |
| Hashável (usável como chave) | ❌ | ✅ | ❌ |
Exemplo Completo: Análise de Participação
presenca_semana1 = {"Ana", "Bruno", "Carla", "Diego", "Eduardo"}
presenca_semana2 = {"Bruno", "Carla", "Flávia", "Gustavo", "Ana"}
presenca_semana3 = {"Ana", "Carla", "Bruno", "Henrique"}
# Alunos presentes nas três semanas
sempre_presentes = presenca_semana1 & presenca_semana2 & presenca_semana3
print(f"Presentes nas 3 semanas: {sempre_presentes}")
# Todos os alunos que apareceram ao menos uma vez
todos = presenca_semana1 | presenca_semana2 | presenca_semana3
print(f"Total de alunos únicos: {len(todos)}")
# Alunos que faltaram na semana 3
faltaram = todos - presenca_semana3
print(f"Ausentes na semana 3: {faltaram}")
# Registrando datas como tuplas imutáveis
registros = [
("Ana", (2024, 3, 1)),
("Bruno", (2024, 3, 1)),
("Carla", (2024, 3, 8)),
]
for aluno, data in registros:
ano, mes, dia = data
print(f"{aluno} — {dia:02d}/{mes:02d}/{ano}")
Resumo
- Tuplas são sequências imutáveis — usadas para dados que não devem mudar
- A vírgula define a tupla, não os parênteses —
(42,)é tupla,(42)é int - Desempacotamento permite extrair valores de tuplas de forma elegante
- Sets são coleções sem ordem e sem duplicatas
- Operações de conjunto (
|,&,-,^) são eficientes e expressivas set()é a forma idiomática de remover duplicatas de uma lista- Use a tabela comparativa para escolher a estrutura certa para cada situação
Referências e Leituras Complementares
- Tuplas — documentação oficial — https://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences
- Sets — documentação oficial — https://docs.python.org/3/tutorial/datastructures.html#sets
- Operações de conjuntos — https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset
- dict.fromkeys() para deduplicação com ordem — https://docs.python.org/3/library/stdtypes.html#dict.fromkeys
- RAMALHO, Luciano. Fluent Python. 2. ed. O'Reilly Media, 2022. Cap. 2 — análise detalhada de sequências e sets em Python.
- GOODRICH, Michael T. et al. Data Structures and Algorithms in Python. Wiley, 2013. Cap. 1–2 — fundamentos de estruturas de dados com exemplos em Python.
- CORMEN, Thomas H. et al. Introduction to Algorithms. 4. ed. MIT Press, 2022. Cap. 11 — tabelas hash, base teórica de sets e dicionários.