Conjuntos
Um conjunto (set) é uma estrutura de dados utilizada para representar uma coleção de objetos distintos em Python.
Em um conjunto, um mesmo objeto não pode aparecer mais de uma vez.
Por exemplo:
frutas = {"maçã", "banana", "laranja", "banana"}
print(frutas)Resultado:
{"maçã", "banana", "laranja"}Embora "banana" tenha sido informado duas vezes, o conjunto mantém apenas uma ocorrência.
Uma característica importante dos conjuntos é que a ordem dos elementos não faz parte da informação representada.
Por isso, não devemos utilizar um conjunto quando precisamos representar uma sequência em que a posição dos elementos é importante.
Criação de conjuntos
Um conjunto pode ser criado utilizando chaves {}:
frutas = {"maçã", "banana", "laranja"}Também podemos criar um conjunto vazio utilizando set():
conjunto = set()É importante observar que:
conjunto = {}cria um dicionário vazio, e não um conjunto.
Para criar um conjunto a partir de uma sequência, podemos utilizar set():
frutas = set(["maçã", "banana", "laranja"])Também podemos criar um conjunto a partir de uma string:
letras = set("banana")
print(letras)O resultado será um conjunto contendo os caracteres distintos encontrados na string.
Elementos repetidos
Conjuntos não armazenam elementos repetidos.
numeros = {1, 2, 3, 2, 1, 3}
print(numeros)Resultado:
{1, 2, 3}Essa característica torna os conjuntos úteis quando queremos trabalhar apenas com valores distintos.
Por exemplo:
nomes = ["Ana", "Bruno", "Ana", "Carlos", "Bruno"]
nomes_unicos = set(nomes)
print(nomes_unicos)Agora temos apenas os nomes distintos.
Adicionar elementos
O método add() adiciona um elemento ao conjunto:
frutas = {"maçã", "banana"}
frutas.add("laranja")
print(frutas)O conjunto passa a conter "laranja".
Se tentarmos adicionar um elemento que já existe, nada é alterado:
frutas.add("banana")
print(frutas)O conjunto continua contendo apenas uma ocorrência de "banana".
Adicionar vários elementos
O método update() permite adicionar vários elementos de uma vez:
frutas = {"maçã", "banana"}
frutas.update(["laranja", "uva", "abacaxi"])
print(frutas)Os elementos da sequência são adicionados individualmente ao conjunto.
Também podemos utilizar outro conjunto:
frutas.update({"melancia", "mamão"})Remover elementos
O método remove() remove um elemento específico:
frutas = {"maçã", "banana", "laranja"}
frutas.remove("banana")
print(frutas)Se o elemento não existir, remove() gera uma exceção KeyError.
Quando queremos remover um elemento sem gerar erro caso ele não exista, podemos utilizar discard():
frutas = {"maçã", "banana", "laranja"}
frutas.discard("uva")
print(frutas)Nesse caso, nada acontece porque "uva" não pertence ao conjunto.
Remover um elemento qualquer
O método pop() remove e retorna um elemento do conjunto:
frutas = {"maçã", "banana", "laranja"}
fruta = frutas.pop()
print(fruta)
print(frutas)Como conjuntos não possuem uma ordem definida para acesso, não devemos assumir qual elemento será removido por pop().
Esvaziar um conjunto
O método clear() remove todos os elementos:
frutas = {"maçã", "banana", "laranja"}
frutas.clear()
print(frutas)Resultado:
set()Tamanho do conjunto
A função len() retorna a quantidade de elementos do conjunto:
frutas = {"maçã", "banana", "laranja"}
print(len(frutas))Resultado:
3Como elementos repetidos não são armazenados, eles não são contabilizados:
numeros = {10, 20, 10, 30, 20}
print(len(numeros))Resultado:
3Verificar se um elemento existe
O operador in permite verificar se determinado elemento pertence ao conjunto:
frutas = {"maçã", "banana", "laranja"}
print("banana" in frutas)Resultado:
TrueTambém podemos utilizar not in:
print("uva" not in frutas)Resultado:
TruePercorrer um conjunto
Podemos percorrer os elementos de um conjunto utilizando for:
frutas = {"maçã", "banana", "laranja"}
for fruta in frutas:
print(fruta)A ordem em que os elementos serão exibidos não deve ser considerada como parte do conjunto.
União
A união combina os elementos de dois conjuntos, mantendo apenas os elementos distintos.
Podemos utilizar o operador |:
frutas1 = {"maçã", "banana", "laranja"}
frutas2 = {"banana", "uva", "abacaxi"}
resultado = frutas1 | frutas2
print(resultado)O resultado contém todos os elementos dos dois conjuntos.
Também podemos utilizar o método union():
resultado = frutas1.union(frutas2)Interseção
A interseção retorna apenas os elementos que pertencem aos dois conjuntos.
Podemos utilizar o operador &:
frutas1 = {"maçã", "banana", "laranja"}
frutas2 = {"banana", "laranja", "uva"}
resultado = frutas1 & frutas2
print(resultado)Resultado:
{"banana", "laranja"}Também podemos utilizar:
resultado = frutas1.intersection(frutas2)Diferença
A diferença retorna os elementos que pertencem ao primeiro conjunto, mas não ao segundo.
Podemos utilizar o operador -:
frutas1 = {"maçã", "banana", "laranja"}
frutas2 = {"banana", "uva"}
resultado = frutas1 - frutas2
print(resultado)Resultado:
{"maçã", "laranja"}Também podemos utilizar:
resultado = frutas1.difference(frutas2)A direção da operação é importante:
frutas1 - frutas2não representa necessariamente o mesmo resultado que:
frutas2 - frutas1Diferença simétrica
A diferença simétrica retorna os elementos que pertencem a apenas um dos conjuntos.
Podemos utilizar o operador ^:
frutas1 = {"maçã", "banana", "laranja"}
frutas2 = {"banana", "uva", "abacaxi"}
resultado = frutas1 ^ frutas2
print(resultado)O elemento "banana" não aparece no resultado porque pertence aos dois conjuntos.
Também podemos utilizar:
resultado = frutas1.symmetric_difference(frutas2)Subconjunto
Podemos verificar se todos os elementos de um conjunto pertencem a outro utilizando issubset() ou o operador <=.
frutas = {"maçã", "banana", "laranja"}
algumas_frutas = {"banana", "laranja"}
print(algumas_frutas.issubset(frutas))Resultado:
TrueTambém podemos escrever:
print(algumas_frutas <= frutas)Nesse caso, algumas_frutas é um subconjunto de frutas.
Superconjunto
O método issuperset() verifica se um conjunto contém todos os elementos de outro:
frutas = {"maçã", "banana", "laranja"}
algumas_frutas = {"banana", "laranja"}
print(frutas.issuperset(algumas_frutas))Resultado:
TrueTambém podemos utilizar >=:
print(frutas >= algumas_frutas)Conjuntos não possuem índices
Diferentemente das listas, conjuntos não possuem posições que possam ser acessadas por índices.
O código abaixo não é válido:
frutas = {"maçã", "banana", "laranja"}
print(frutas[0])Um conjunto não deve ser utilizado quando precisamos acessar elementos pela posição.
Se precisarmos transformar um conjunto em uma lista:
frutas = {"maçã", "banana", "laranja"}
lista = list(frutas)
print(lista)Agora temos uma lista e podemos utilizar índices.
Elementos de um conjunto
Os elementos de um conjunto precisam ser objetos que possam ser utilizados como elementos de um conjunto.
Por exemplo, podemos utilizar números e strings:
dados = {10, 20, 30, "Python"}Também podemos utilizar tuplas:
dados = {(1, 2), (3, 4)}Por outro lado, uma lista não pode ser diretamente armazenada em um conjunto:
dados = {[1, 2], [3, 4]}Esse código gera uma exceção TypeError.
Exemplo completo
O exemplo abaixo demonstra algumas das principais operações realizadas com conjuntos:
frutas = {"maçã", "banana", "laranja"}
print("Conjunto inicial:")
print(frutas)
frutas.add("uva")
print("\nApós adicionar:")
print(frutas)
frutas.discard("banana")
print("\nApós remover:")
print(frutas)
print("\nPossui laranja?")
print("laranja" in frutas)
outras_frutas = {"laranja", "uva", "abacaxi"}
print("\nUnião:")
print(frutas | outras_frutas)
print("\nInterseção:")
print(frutas & outras_frutas)
print("\nDiferença:")
print(frutas - outras_frutas)Principais operações e métodos
| Operação ou método | Função |
|---|---|
add() | Adiciona um elemento |
update() | Adiciona vários elementos |
remove() | Remove um elemento e gera erro se ele não existir |
discard() | Remove um elemento sem gerar erro caso ele não exista |
pop() | Remove e retorna um elemento |
clear() | Remove todos os elementos |
len() | Retorna a quantidade de elementos |
in | Verifica se um elemento pertence ao conjunto |
union() | Realiza a união |
intersection() | Realiza a interseção |
difference() | Realiza a diferença |
symmetric_difference() | Realiza a diferença simétrica |
issubset() | Verifica se é subconjunto |
issuperset() | Verifica se é superconjunto |
Também existem operadores específicos para as operações entre conjuntos:
| → união
& → interseção
- → diferença
^ → diferença simétrica
<= → subconjunto
>= → superconjuntoExemplo prático
Considere duas turmas de estudantes:
turma_a = {"Ana", "Bruno", "Carlos", "Daniel"}
turma_b = {"Carlos", "Daniel", "Eduardo", "Fernanda"}Podemos descobrir quais estudantes estão nas duas turmas:
print(turma_a & turma_b)Quais estudantes estão em pelo menos uma das turmas:
print(turma_a | turma_b)Quais estudantes estão apenas na primeira turma:
print(turma_a - turma_b)E quais estudantes pertencem a apenas uma das turmas:
print(turma_a ^ turma_b)Conclusão
O set é uma estrutura de dados utilizada para representar uma coleção de objetos distintos.
Suas principais características são:
- Não permite elementos duplicados.
- Não possui índices.
- A ordem dos elementos não deve ser considerada.
- Permite adicionar e remover elementos.
- Permite verificar rapidamente a existência de um elemento.
- Pode ser utilizado para eliminar valores duplicados.
- Permite realizar operações matemáticas de conjuntos, como união, interseção e diferença.
O conjunto é especialmente útil quando a informação importante é quais objetos pertencem a uma coleção, e não a posição em que eles aparecem.