Tuplas e conjuntos
Você conhece listas. O Python tem mais dois tipos de coleção que resolvem problemas que as listas não conseguem. Tuplas guardam um grupo fixo de valores que nunca vai mudar. Conjuntos guardam apenas valores únicos e permitem verificar a pertinência instantaneamente, não importa o tamanho da coleção.
Tuplas
Uma tupla é um grupo ordenado de valores que não pode ser alterado após sua criação. Parênteses definem uma tupla, mas são opcionais. A vírgula é o que de fato faz dela uma tupla. Uma tupla de um único item exige uma vírgula no final.
point = (10, 20)
rgb = (255, 128, 0)
dimensions = (1920, 1080)
single = (42,) # vírgula no final é obrigatória para uma tupla de um único item
also_tuple = 42, 99 # os parênteses são opcionais; a vírgula é o que faz dela uma tuplaO acesso por índice funciona exatamente como em uma lista. Tentar alterar um item levanta um TypeError:
point = (10, 20)
point[0] # 10
point[1] # 20
point[-1] # 20
point[0] = 99 # TypeError: 'tuple' object does not support item assignmentQuando usar uma tupla
Use uma tupla quando você tiver um pequeno grupo de valores relacionados que pertencem juntos e não vão mudar. Coordenadas (x, y), uma cor (r, g, b), um par nome-pontuação ("João", 87). A estrutura fixa sinaliza para quem lê o código que este grupo é tratado como uma única unidade.
locations = {}
locations[(40, -74)] = "Nova York" # tupla como chave de dicionário, funciona
locations[[40, -74]] = "Nova York" # lista como chave de dicionário, TypeErrorDesempacotamento
O desempacotamento extrai valores de uma tupla e atribui cada um ao seu próprio nome em uma única linha. O número de nomes deve corresponder ao número de valores. Use * para capturar quaisquer itens restantes em uma lista.
point = (10, 20)
x, y = point
print(x) # 10
print(y) # 20
first, *rest = [1, 2, 3, 4, 5]
# first = 1, rest = [2, 3, 4, 5]
head, *middle, tail = [1, 2, 3, 4, 5]
# head = 1, middle = [2, 3, 4], tail = 5Tuplas nomeadas
Uma tupla nomeada é uma tupla onde cada posição tem um nome. Em vez de lembrar que point[0] é a coordenada x, você escreve point.x. Os valores continuam imutáveis; você apenas ganha nomes de atributos legíveis em vez de posições numéricas.
Importação de tupla nomeada
namedtuple está na biblioteca padrão do Python, mas precisa ser importada. A linha from collections import namedtuple é a primeira importação deste curso. Importações são cobertas integralmente no capítulo Módulos.
from collections import namedtuple
Point = namedtuple("Point", ["x", "y"])
Player = namedtuple("Player", ["name", "score", "level"])
p = Point(10, 20)
p.x # 10
p.y # 20
alice = Player("João", 87, 5)
alice.name # "João"
alice.score # 87Conjuntos
Um conjunto é uma coleção de valores únicos sem ordem garantida. Adicionar o mesmo valor duas vezes não faz nada: um conjunto mantém apenas uma cópia de cada item. Use chaves para um conjunto com itens, ou set() para criar um conjunto vazio.
tags = {"python", "iniciante", "tutorial"}
numbers = {1, 2, 3, 4, 5}
empty = set() # NÃO {} (isso é um dicionário vazio)Adicionar o mesmo valor duas vezes não muda o conjunto:
tags.add("python") # tags fica inalterado, "python" já está neleQuando usar um conjunto
Conjuntos são a ferramenta certa para três coisas: remover duplicatas de uma lista, verificar rapidamente se algo está em uma grande coleção, e comparar dois grupos para descobrir o que compartilham ou em que diferem.
# Remove duplicatas de uma lista
raw = ["gato", "cachorro", "gato", "passaro", "cachorro", "gato"]
unique = list(set(raw)) # ["gato", "cachorro", "passaro"] (ordem não garantida)# Verificação rápida de pertinência
valid_codes = {"USD", "EUR", "GBP", "JPY"}
code = "EUR"
if code in valid_codes: # consulta instantânea, mesmo com milhares de códigos
print("Válido")Operações de conjuntos
Conjuntos suportam as mesmas operações que você aprendeu em matemática: união (tudo em qualquer um dos conjuntos), interseção (apenas o que ambos os conjuntos compartilham), e diferença (o que um tem que o outro não tem). O Python usa símbolos de operadores para essas, e cada uma tem um método equivalente.
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
a | b # {1, 2, 3, 4, 5, 6} (união: tudo em qualquer um)
a & b # {3, 4} (interseção: apenas nos dois)
a - b # {1, 2} (diferença: em a mas não em b)
b - a # {5, 6} (diferença no sentido contrário)
a ^ b # {1, 2, 5, 6} (diferença simétrica: em um mas não em ambos)Estes também têm formas de método: .union(), .intersection(), .difference(), .symmetric_difference().
Modificando conjuntos
Conjuntos são mutáveis. .add() adiciona um item. .update() adiciona vários de uma vez a partir de qualquer lista ou outro iterável. .remove() apaga um item, mas levanta um erro se ele não estiver lá. .discard() apaga silenciosamente se o item existir e não faz nada se não existir.
tags = {"python", "iniciante"}
tags.add("tutorial") # adiciona um item
tags.update(["web", "api"]) # adiciona múltiplos itens de qualquer iterável
tags.remove("iniciante") # remove, levanta KeyError se não encontrado
tags.discard("inexistente") # remove, sem erro se não encontrado
tags.pop() # remove e retorna um item arbitrário
tags.clear() # remove tudoUse .discard() quando você não tem certeza se o item existe.
Conjuntos congelados
Um conjunto congelado (frozen set) é um conjunto que não pode ser modificado após a criação. A principal razão para usá-lo: conjuntos congelados são hasháveis, então podem ser usados como chaves de dicionário ou armazenados dentro de outros conjuntos.
valid_statuses = frozenset({"active", "paused", "deleted"})
valid_statuses.add("archived") # AttributeError, frozenset é imutávelEscolhendo a coleção certa
Quatro tipos, cada um com um papel claro. Pergunte o que você precisa fazer com os dados e a escolha certa geralmente se torna óbvia.
| list | tuple | set | dict | |
|---|---|---|---|---|
| Ordenado | Sim | Sim | Não | Sim (ordem de inserção) |
| Mutável | Sim | Não | Sim | Sim |
| Duplicatas | Sim | Sim | Não | Não (chaves) |
| Acesso por | Índice | Índice | n/a | Chave |
| Use quando | Sequência ordenada e modificável | Registro fixo | Valores únicos, pertinência rápida | Consulta chave-valor |
Uma regra rápida de decisão:
- Precisa consultar algo por nome? → dict
- Precisa de uma coleção ordenada que você vai modificar? → list
- Tem um grupo fixo de valores relacionados? → tuple
- Precisa de valores únicos ou testes rápidos de pertinência? → set
Na prática
Usando tuplas para armazenar registros fixos e um conjunto para rastrear valores únicos:
home = (51.5074, -0.1278) # latitude, longitude
office = (51.5155, -0.0922)
home_lat, home_lon = home
print(f"Casa: {home_lat}, {home_lon}")
# Rastreia visitantes únicos com um conjunto
visitors = set()
visitors.add("joão")
visitors.add("pedro")
visitors.add("joão") # já no conjunto, ignorado silenciosamente
visitors.add("maria")
print(f"Visitantes únicos: {len(visitors)}")
print(f"joão visitou: {'joão' in visitors}")
print(f"ana visitou: {'ana' in visitors}")
