Conjuntos & Frozensets
Conjuntos armazenam elementos hasheáveis únicos com testes de associação rápidos. Frozensets são conjuntos imutáveis que você pode usar como chaves de dicionário ou elementos de outros conjuntos.
Receita
seen: set[int] = set()
for value in [1, 2, 2, 3]:
if value not in seen:
seen.add(value)
a, b = {1, 2, 3}, {3, 4}
union = a | b
only_a = a - bQuando usar isso:
- Desduplicar sequências antes do processamento
- Interseções de permissões/tags
- Coleções de vizinhos de grafos
- Encontrar diferenças simétricas entre snapshots
Exemplo de Trabalho
def unique_preserve_order(items: list[str]) -> list[str]:
seen: set[str] = set()
result: list[str] = []
for item in items:
if item not in seen:
seen.add(item)
result.append(item)
return result
def jaccard(tags_a: set[str], tags_b: set[str]) -> float:
if not tags_a and not tags_b:
return 1.0
return len(tags_a & tags_b) / len(tags_a | tags_b)
def frozen_key(groups: list[frozenset[str]]) -> dict[frozenset[str], int]:
return {group: len(group) for group in groups}
if __name__ == "__main__":
print(unique_preserve_order(["a", "b", "a", "c"]))
print(jaccard({"py", "ml"}, {"py", "web"}))
print(frozen_key([frozenset({"a", "b"}), frozenset({"c"})]))O que isso demonstra:
- Desduplicação manual que preserva a ordem quando
dict.fromkeysnão oferece controle de ordenação suficiente &e|para interseção e uniãofrozensetcomo chave de dicionário para agrupamentos
Mergulho Profundo
Como Funciona
- Hash set - O(1) médio igual às chaves de dicionário sem valores.
- Não ordenado - A ordem de iteração depende da implementação - não confie para semântica.
- frozenset - Imutável; hasheável se os elementos forem hasheáveis.
- Testes de subconjunto -
a <= b,a < b,a >= bpara contenção. - Compreensões -
{x for x in items if cond}constrói conjuntos diretamente.
Operações
| Operador | Significado |
|---|---|
| | união |
& | interseção |
- | diferença |
^ | diferença simétrica |
Notas Python
# conjunto vazio - não {}
empty = set()
# adicionar em massa
tags.update(["a", "b", "c"])
# discard vs remove - discard ignora elementos ausentes
tags.discard("missing")Armadilhas
{}é um dicionário vazio - Useset()para um conjunto vazio. Correção:set()ou um placeholder{0}apenas se intencional.- Elementos não hasheáveis - Listas em conjuntos falham. Correção: Converta para tupla ou frozenset.
- Suposições de ordem - Conjuntos não preservam a ordem de inserção para lógica. Correção: Truque
dict.fromkeysou loop de desduplicação ordenado. - Conjuntos minúsculos mais lentos que varredura de lista - O overhead constante importa para n < ~10. Correção: Perfilar antes de otimizar.
- Mutação de conjunto durante iteração - Erro de alteração de tamanho. Correção: Copie
set(s)antes de remover no loop.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
dict.fromkeys | Chaves únicas que preservam a ordem | Precisa de álgebra de conjuntos |
list + in | n muito pequeno | Verificações de associação grandes |
bloom filter | Escala enorme probabilística | Precisa de associação exata |
pandas.unique | Desduplicação de coluna em dataframes | Script Python simples |
FAQs
set ou list para unicidade?
set quando a ordem não importa e a associação é frequente. A desduplicação que preserva a ordem usa dicionário ou loop manual.
Para que serve frozenset?
Conjunto hasheável - chaves de dicionário, elementos de conjunto, chaves de cache a partir de frozenset de tags.
Como intersetar muitos conjuntos?
from functools import reduce; reduce(set.__and__, sets) ou loop com acc &= s.
issubset vs <=?
O mesmo para conjuntos - escolha o operador legível ou o método consistentemente na base de código.
Conjuntos podem conter tipos mistos?
Sim, se todos os elementos forem hasheáveis e comparáveis por igualdade - mas prejudica a clareza; prefira conjuntos homogêneos.
Como desduplicar preservando a ordem no Python 3.7+?
list(dict.fromkeys(items)) - padrão idiomático rápido.
Caso de uso de symmetric_difference?
Elementos em um ou outro conjunto, mas não em ambos - comparando concessões de permissão entre ambientes.
compreensão de conjunto vs filter?
{x for x in items if pred(x)} constrói o conjunto diretamente sem lista intermediária.
Conjuntos são thread-safe?
Operações individuais são atômicas no CPython, mas a leitura-modificação-escrita composta precisa de locks.
pop de um conjunto?
set.pop() remove um elemento arbitrário - útil apenas quando qualquer elemento é aceitável.
Relacionados
- Dicionários - mapas vs conjuntos
- Imutabilidade & Hashability - regras de hash
- Módulo collections - Counter usa dict, não set
- Escolhendo a Estrutura de Dados Certa - padrões de associação
Versões da Pilha: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.