Tuplas e Sets são estruturas de dados poderosas que complementam listas e dicionários. Enquanto tuplas são sequências imutáveis perfeitas para dados fixos, sets são coleções não-ordenadas ideais para operações matemáticas e remoção de duplicatas. Neste guia completo, você dominará ambas as estruturas.
🔒 Tuplas: Listas Imutáveis
O Que São Tuplas?
Tuplas são como cápsulas de dados seladas no Universo Python - uma vez criadas, não podem ser modificadas. Use tuplas quando os dados não devem mudar.
# Criar tuplas
vazia = ()
coordenadas = (10, 20)
planeta = ("Terra", 12742, 5.97e24) # nome, diâmetro_km, massa_kg
um_elemento = (42,) # Vírgula obrigatória!
# Sem parênteses também funciona (tuple packing)
ponto = 10, 20, 30
print(type(ponto)) # <class 'tuple'>
# Converter para tupla
lista = [1, 2, 3]
tupla = tuple(lista)
print(tupla) # (1, 2, 3)
Acessando Elementos
planetas = ("Mercúrio", "Vênus", "Terra", "Marte")
# Indexação
print(planetas[0]) # Mercúrio
print(planetas[-1]) # Marte
# Fatiamento
print(planetas[1:3]) # ('Vênus', 'Terra')
print(planetas[:2]) # ('Mercúrio', 'Vênus')
# Iterar
for planeta in planetas:
print(f"🪐 {planeta}")
Tuplas São Imutáveis
coordenadas = (10, 20, 30)
# ❌ Isso gera erro!
# coordenadas[0] = 15 # TypeError
# ✅ Para "modificar", crie nova tupla
x, y, z = coordenadas
nova_coordenadas = (15, y, z)
print(nova_coordenadas) # (15, 20, 30)
Desempacotamento (Unpacking)
# Desempacotar valores
ponto = (100, 200, 300)
x, y, z = ponto
print(f"X: {x}, Y: {y}, Z: {z}")
# Com *rest para pegar múltiplos valores
numeros = (1, 2, 3, 4, 5)
primeiro, segundo, *resto = numeros
print(primeiro) # 1
print(segundo) # 2
print(resto) # [3, 4, 5]
# Trocar valores (swap)
a = 10
b = 20
a, b = b, a # Usa tupla temporária!
print(f"a={a}, b={b}") # a=20, b=10
Métodos de Tuplas
numeros = (1, 2, 3, 2, 4, 2, 5)
# count() - contar ocorrências
print(numeros.count(2)) # 3
# index() - encontrar índice
print(numeros.index(4)) # 4
print(numeros.index(2)) # 1 (primeira ocorrência)
# Operações
tupla1 = (1, 2, 3)
tupla2 = (4, 5, 6)
# Concatenação
print(tupla1 + tupla2) # (1, 2, 3, 4, 5, 6)
# Repetição
print(tupla1 * 3) # (1, 2, 3, 1, 2, 3, 1, 2, 3)
# Verificar existência
print(2 in tupla1) # True
Quando Usar Tuplas
- ✅ Dados que não devem mudar (coordenadas, configurações)
- ✅ Retornar múltiplos valores de funções
- ✅ Chaves de dicionários (tuplas são hashable)
- ✅ Performance (ligeiramente mais rápidas que listas)
# Retornar múltiplos valores
def calcular_estatisticas(numeros):
return min(numeros), max(numeros), sum(numeros)
minimo, maximo, total = calcular_estatisticas([1, 2, 3, 4, 5])
# Tuplas como chaves de dicionário
localizacoes = {
(0, 0): "Origem",
(10, 20): "Ponto A",
(30, 40): "Ponto B"
}
print(localizacoes[(10, 20)]) # Ponto A
🎯 Sets: Conjuntos Matemáticos
O Que São Sets?
Sets são coleções não-ordenadas de elementos únicos. Perfeitos para eliminar duplicatas e operações de conjunto como união e interseção.
# Criar sets
vazio = set() # {} cria dict, não set!
numeros = {1, 2, 3, 4, 5}
frutas = {"maçã", "banana", "laranja"}
# Duplicatas são automaticamente removidas
com_duplicatas = {1, 2, 2, 3, 3, 3, 4}
print(com_duplicatas) # {1, 2, 3, 4}
# Converter para set
lista = [1, 2, 2, 3, 3, 4]
sem_duplicatas = set(lista)
print(sem_duplicatas) # {1, 2, 3, 4}
# Set a partir de string
letras = set("python")
print(letras) # {'p', 'y', 't', 'h', 'o', 'n'}
Adicionando e Removendo
linguagens = {"Python", "JavaScript", "Java"}
# add() - adicionar um elemento
linguagens.add("C++")
linguagens.add("Python") # Já existe, não duplica
print(linguagens)
# update() - adicionar múltiplos
linguagens.update(["Go", "Rust", "TypeScript"])
print(linguagens)
# remove() - remove elemento (erro se não existir)
linguagens.remove("Java")
# discard() - remove elemento (sem erro se não existir)
linguagens.discard("PHP") # Não existe, mas não gera erro
# pop() - remove e retorna elemento aleatório
removido = linguagens.pop()
print(f"Removido: {removido}")
# clear() - limpar tudo
linguagens.clear()
print(linguagens) # set()
Operações de Conjunto
a = {1, 2, 3, 4, 5}
b = {4, 5, 6, 7, 8}
# União - elementos em A ou B
print(a | b) # {1, 2, 3, 4, 5, 6, 7, 8}
print(a.union(b))
# Interseção - elementos em A e B
print(a & b) # {4, 5}
print(a.intersection(b))
# Diferença - elementos em A mas não em B
print(a - b) # {1, 2, 3}
print(a.difference(b))
# Diferença simétrica - elementos em A ou B, mas não em ambos
print(a ^ b) # {1, 2, 3, 6, 7, 8}
print(a.symmetric_difference(b))
# Subconjunto
print({1, 2} <= {1, 2, 3}) # True
print({1, 2}.issubset({1, 2, 3}))
# Superconjunto
print({1, 2, 3} >= {1, 2}) # True
print({1, 2, 3}.issuperset({1, 2}))
Verificações
frutas = {"maçã", "banana", "laranja"}
# in - verificar se existe
print("maçã" in frutas) # True
print("uva" not in frutas) # True
# len() - tamanho
print(len(frutas)) # 3
# Iterar (ordem não garantida!)
for fruta in frutas:
print(f"🍎 {fruta}")
🎯 Projeto Prático: Sistema de Tags e Categorias
Sistema usando sets e tuplas com POO:
class GerenciadorTags:
"""Gerencia tags e categorias de artigos"""
def __init__(self):
self.artigos = [] # Lista de (titulo, tags)
self.todas_tags = set() # Set de todas as tags
def adicionar_artigo(self, titulo, tags):
"""Adiciona artigo com tags"""
# Converter para set para remover duplicatas
tags_set = set(tags)
# Armazenar como tupla (imutável)
artigo = (titulo, frozenset(tags_set))
self.artigos.append(artigo)
# Atualizar set de todas as tags
self.todas_tags.update(tags_set)
print(f"✅ Artigo '{titulo}' adicionado com {len(tags_set)} tags")
def buscar_por_tag(self, tag):
"""Busca artigos que contêm a tag"""
resultados = []
for titulo, tags in self.artigos:
if tag in tags:
resultados.append(titulo)
return resultados
def tags_comuns(self, titulo1, titulo2):
"""Encontra tags em comum entre dois artigos"""
tags1 = None
tags2 = None
for titulo, tags in self.artigos:
if titulo == titulo1:
tags1 = tags
if titulo == titulo2:
tags2 = tags
if tags1 and tags2:
return tags1 & tags2 # Interseção
return set()
def tags_exclusivas(self, titulo):
"""Encontra tags únicas de um artigo"""
tags_artigo = None
for t, tags in self.artigos:
if t == titulo:
tags_artigo = tags
break
if not tags_artigo:
return set()
# Tags de todos os outros artigos
outras_tags = set()
for t, tags in self.artigos:
if t != titulo:
outras_tags.update(tags)
# Diferença: tags do artigo que não estão em outros
return tags_artigo - outras_tags
def recomendar_similar(self, titulo, n=3):
"""Recomenda artigos similares baseado em tags"""
tags_alvo = None
for t, tags in self.artigos:
if t == titulo:
tags_alvo = tags
break
if not tags_alvo:
return []
# Calcular similaridade
similaridades = []
for t, tags in self.artigos:
if t != titulo:
# Interseção / União (Jaccard similarity)
comuns = len(tags_alvo & tags)
total = len(tags_alvo | tags)
score = comuns / total if total > 0 else 0
similaridades.append((t, score, comuns))
# Ordenar por score
similaridades.sort(key=lambda x: x[1], reverse=True)
return similaridades[:n]
def estatisticas(self):
"""Mostra estatísticas do sistema"""
print("\n" + "="*60)
print("📊 ESTATÍSTICAS DO SISTEMA")
print("="*60)
print(f"📄 Total de artigos: {len(self.artigos)}")
print(f"🏷️ Total de tags: {len(self.todas_tags)}")
# tag mais popular
contagem_tags = {}
for titulo, tags in self.artigos:
for tag in tags:
contagem_tags[tag] = contagem_tags.get(tag, 0) + 1
if contagem_tags:
tag_popular = max(contagem_tags.items(), key=lambda x: x[1])
print(f"🌟 Tag mais popular: '{tag_popular[0]}' ({tag_popular[1]} artigos)")
print(f"\n🏷️ Todas as tags: {', '.join(sorted(self.todas_tags))}")
# === USANDO O SISTEMA ===
gerenciador = GerenciadorTags()
# Adicionar artigos
gerenciador.adicionar_artigo(
"Listas em Python",
["python", "listas", "estruturas de dados", "iniciante"]
)
gerenciador.adicionar_artigo(
"Dicionários em Python",
["python", "dicionários", "estruturas de dados", "iniciante"]
)
gerenciador.adicionar_artigo(
"POO em Python",
["python", "programação orientada objetos", "classes", "avançado"]
)
gerenciador.adicionar_artigo(
"Herança em Python",
["python", "programação orientada objetos", "herança", "avançado"]
)
# Buscar por tag
print("\n🔍 Artigos com tag 'python':")
resultados = gerenciador.buscar_por_tag("python")
for artigo in resultados:
print(f" • {artigo}")
# Tags em comum
print("\n🔗 Tags em comum:")
comuns = gerenciador.tags_comuns("POO em Python", "Herança em Python")
print(f" {comuns}")
# Tags exclusivas
print("\n⭐ Tags exclusivas de 'Listas em Python':")
exclusivas = gerenciador.tags_exclusivas("Listas em Python")
print(f" {exclusivas}")
# Recomendar similares
print("\n💡 Artigos similares a 'POO em Python':")
similares = gerenciador.recomendar_similar("POO em Python")
for titulo, score, comuns in similares:
print(f" • {titulo} (score: {score:.2f}, {comuns} tags comuns)")
# Estatísticas
gerenciador.estatisticas()
📊 Comparação: Lista vs Tupla vs Set
| Característica | Lista | Tupla | Set |
|---|---|---|---|
| Sintaxe | [] |
() |
{} ou set() |
| Mutável | ✅ Sim | ❌ Não | ✅ Sim |
| Ordenada | ✅ Sim | ✅ Sim | ❌ Não |
| Duplicatas | ✅ Permite | ✅ Permite | ❌ Remove |
| Indexação | ✅ Sim | ✅ Sim | ❌ Não |
| Performance | Média | Rápida | Muito rápida |
| Uso típico | Coleção geral | Dados fixos | Únicos, operações |
💡 Boas Práticas
- Use tuplas para dados imutáveis: Coordenadas, configurações
- Use sets para eliminar duplicatas
- Use sets para verificação rápida de existência
- frozenset para sets imutáveis: Podem ser chaves de dict
- Desempacote tuplas para legibilidade
# ✅ BOM - eliminar duplicatas
lista = [1, 2, 2, 3, 3, 4]
unicos = list(set(lista))
# ✅ BOM - verificação rápida O(1)
permitidos = {"admin", "user", "guest"}
if role in permitidos:
print("Acesso permitido")
# ✅ BOM - retornar múltiplos valores
def processar():
return True, "Sucesso", 42
sucesso, mensagem, codigo = processar()
🚀 Próximos Passos
- Listas - Estrutura mutável ordenada
- Dicionários - Mapeamento chave-valor
- POO - Use sets em atributos
- Funções - Retorne tuplas
- Collections module - defaultdict, Counter, namedtuple
Domine todas as estruturas de dados! Confira nosso curso completo de Python!
📝 Resumo
- ✅ Tuplas - sequências imutáveis
- ✅ Desempacotamento de tuplas
- ✅ Sets - coleções únicas não-ordenadas
- ✅ Operações de conjunto (união, interseção)
- ✅ Projeto: Sistema de tags e recomendações
- ✅ Comparação entre estruturas
- ✅ Quando usar cada estrutura
Tuplas e sets completam seu arsenal de estruturas de dados em Python. Cada uma tem seu propósito específico - escolha a ferramenta certa para o problema certo!