Python

Tuplas e Sets: imutabilidade e unicidade Já leu

6 min de leitura

Tuplas e Sets: imutabilidade e unicidade
Python oferece mais de uma forma de agrupar dados. Enquanto listas são flexíveis e mutáveis, existem situações em que voc&eci

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

Comentários

Mais em Python

Módulos, Pacotes e Organização de Projetos
Módulos, Pacotes e Organização de Projetos

&Agrave; medida que um programa cresce, colocar tudo em um &uacute;nico arqui...

Operadores e Expressões
Operadores e Expressões

Se vari&aacute;veis s&atilde;o os recipientes que guardam dados, os operadore...

Interfaces, Protocolos e Composição
Interfaces, Protocolos e Composição

No artigo anterior vimos que heran&ccedil;a &eacute; uma ferramenta poderosa...