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? Link para o cabeçalho
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 Link para o cabeçalho
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 Link para o cabeçalho
Além de garantir a unicidade de elementos, também podemos efetuar operações com conjuntos aumentando a sua aplicação.
União Link para o cabeçalho
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 Link para o cabeçalho
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 Link para o cabeçalho
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 Link para o cabeçalho
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 Link para o cabeçalho
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!