Vamos falar um pouco sobre sets (conjuntos) em python. Se você já trabalha com a linguagem, provavelmente já se deparou com esses casos, mas se está iniciando na linguagem, talvez sejam exemplos interessantes para aprender.
Por que conjuntos?
Conjuntos são coleções que não permitem elementos duplicados. Dessa forma, são uma ótima estrutura de dados para verificar se um elemento já existe e garantir que esse elemento exista apenas uma vez.
Observação: um set é uma construção matemática da Teoria dos Conjuntos :)
Definindo um conjunto
Podemos definir um conjunto de duas formas.
# utilizando a sintaxe de {}
conjunto = {'Terra', 'Marte', 'Saturno'}
# utilizando a classe `set`
conjunto = set(['Terra', 'Marte', 'Saturno'])
Não existe muita diferença entre as versões, apenas que na segunda podemos utilizar uma lista e definir o conjunto com entradas do usuário.
Utilizando a sintaxe conjunto = set(['Terra', 'Marte', 'Saturno'])
podemos obter uma lista de elementos não repetidos. Por exemplo:
uma_lista = ['Terra', 'Marte', 'Saturno', 'Terra']
conjunto = set(uma_lista)
conjunto
> set(['Saturno', 'Marte', 'Terra']) # Note que tem apenas um elemento 'Terra'
Operações com conjuntos
Além de garantir a unicidade de elementos, também podemos efetuar operações com conjuntos aumentando a sua aplicação.
União
Aqui os elementos de um conjunto A são adicionados aos elementos de um conjunto B. Note que o resultado é um novo conjunto.
# exemplos de bibliotecas
usuario_a = {'pandas', 'numpy', 'tensorflow'}
usuario_b = {'pandas', 'pytorch'}
resultado = usuario_a | usuario_b
resultado
> set(['tensorflow', 'pytorch', 'numpy', 'pandas'])
Note no exemplo acima que pandas
ocorre nos dois conjuntos, mas apenas uma vez no conjunto resultado
.
A sintaxe utilizando o operador |
é uma facilidade para usuario_a.union(usuario_b)
.
Intersecção
Obtemos os elementos que ocorrem no conjunto A e no conjunto B. O resultado também é um novo conjunto.
# exemplos de bibliotecas
usuario_a = {'pandas', 'numpy', 'tensorflow'}
usuario_b = {'pandas', 'pytorch'}
resultado = usuario_a & usuario_b
resultado
> set(['pandas'])
Note no exemplo acima que pandas
é o único elemento que ocorre nos dois conjuntos.
Nesse exemplo, o operador &
também é apenas uma facilidade para usuario_a.intersection(usuario_b)
.
Diferença
Outra operação que é muito comum com conjuntos é a diferença. Nesse caso, queremos os elementos do conjunto A que não existem no conjunto B. Novamente, o resultado é um novo conjunto.
# exemplos de bibliotecas
usuario_a = {'pandas', 'numpy', 'tensorflow'}
usuario_b = {'pandas', 'pytorch'}
resultado = usuario_a - usuario_b
resultado
> set(['tensorflow', 'numpy'])
O elemento pandas
ocorre nos dois conjuntos, portanto ele foi removido no conjunto resultante.
Como numpy
e tensorflow
ocorrem apenas no conjunto usuario_a
, eles formam o resultado.
Pertinência
Como podemos saber se um elemento pertence ao conjunto?
Aqui a sintaxe é a mesma que para outras sequências em python, utilizamos in
.
cidades = {'Blumenau', 'Gaspar', 'Indaial'}
'Blumenau' in cidades
> True
'Blumenau' not in cidades
> False
'Pomerode' in cidades
> False
'Pomerode' not in cidades
> True
Outro caso comum, é saber se um conjunto A contém um conjunto B.
cidades_a = {'Blumenau', 'Gaspar', 'Indaial'}
cidades_b = {'Blumenau', 'Indaial'}
cidades_b.issubset(cidades_a)
> True
cidades_b <= cidades_a
> True
cidades_c = {'Blumenau', 'Pomerode'}
cidades_c.issubset(cidades_a)
> False
cidades_c <= cidades_a
> False
Note nos exemplos acima que o operador <=
é apenas uma facilidade para a função issubset
disponível nos conjuntos. Dessa forma, podemos testar se o conjunto B é um subconjunto A.
Também podemos fazer a operação inversa, utilizando o operador >=
ou a função issuperset
.
cidades_a = {'Blumenau', 'Gaspar', 'Indaial'}
cidades_b = {'Blumenau', 'Indaial'}
cidades_a.issuperset(cidades_b)
> True
cidades_a >= cidades_b
> True
cidades_c = {'Blumenau', 'Pomerode'}
cidades_a.issuperset(cidades_c)
> False
cidades_a >= cidades_c
> False
Igualdade
Finalmente, podemos também testar a igualdade de conjuntos. Assim como outras sequências em python, a veracidade é dada pelos elmentos internos e não pela instância do objeto.
cidades_a = {'Blumenau', 'Gaspar', 'Indaial'}
cidades_b = {'Blumenau', 'Indaial', 'Gaspar'}
cidades_a == cidades_b
> True
cidades_a != cidades_b
> False
cidades_c = {'Blumenau', 'Indaial', 'Pomerode'}
cidades_a == cidades_c
> False
cidades_a != cidades_c
> True
Bem pessoal, acho que era isso para hoje. Espero ter passado uma ideia de como são as operações e alguns casos de uso que podemos ter com sets em python. E você tem algum caso específico que quer compartilhar ou alguma dúvida? Manda um tweet :)
Abraço!