Pular para o conteúdo
Editor

Conjuntos em Python (set): valores únicos, operações e usos

Intermediário20 min6 exercícios85 XP

Este tutorial foi traduzido do original em inglês.Read in EnglishLeer en españolЧитать на русскомอ่านภาษาไทยAvisar sobre um erro de tradução

0/6 exercícios

Imagine que você é professor e está fazendo a chamada. Um aluno assina a lista de presença duas vezes sem querer. Isso quer dizer que ele está na aula duas vezes? Claro que não. O que importa é quem veio, não quantas vezes a pessoa escreveu o nome.

Um conjunto em Python (set) funciona do mesmo jeito. É uma coleção que remove duplicatas automaticamente. Cada item de um conjunto é único. Os conjuntos também não se importam com a ordem: o que importa é se um item faz parte ou não.

Neste tutorial, você vai aprender a criar conjuntos, fazer operações poderosas como união e interseção, alterar conjuntos com métodos e descobrir quando os conjuntos são a ferramenta perfeita para o trabalho.

Como criar um conjunto em Python

Você cria um conjunto colocando os itens entre chaves {}, separados por vírgulas. Se você incluir valores repetidos, o Python os ignora sem avisar.

Criando conjuntos com chaves
# A basic set of fruits
fruits = {'apple', 'banana', 'cherry'}
print(fruits)
# Duplicates are automatically removed
colors = {'red', 'blue', 'red', 'green', 'blue'}
print(colors) # Only 3 unique colors
Saída
{'apple', 'banana', 'cherry'}
{'red', 'green', 'blue'}

Repare que a ordem na saída pode ser diferente da que você digitou. Os conjuntos não têm ordem, então o Python pode guardar os itens internamente em qualquer disposição. Não conte com um conjunto para manter uma ordem específica.

Você também pode criar um conjunto a partir de uma lista usando o construtor set(). Essa é uma forma muito usada de remover duplicatas de uma lista.

Criando conjuntos com o construtor set()
# Convert a list with duplicates into a set
names_list = ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob']
names_set = set(names_list)
print(names_set) # Only unique names
# Create a set from a string (each character becomes an item)
letters = set('hello')
print(letters) # {'h', 'e', 'l', 'o'} - only one 'l'
Saída
{'Bob', 'Alice', 'Charlie'}
{'o', 'l', 'e', 'h'}

Operações com conjuntos: união, interseção e diferença

O verdadeiro poder dos conjuntos está nas operações de conjuntos. Com elas, você combina e compara conjuntos e encontra as diferenças entre eles. Pense nos diagramas de Venn das aulas de matemática.

União: junte tudo

A união retorna todos os itens dos dois conjuntos, sem duplicatas. Você pode usar o operador | ou o método .union().

A união junta todos os itens únicos
math_students = {'Alice', 'Bob', 'Charlie'}
science_students = {'Bob', 'Diana', 'Charlie'}
# Union - everyone in either class
all_students = math_students | science_students
print(all_students)
# Same thing using the method
all_students = math_students.union(science_students)
print(all_students)
Saída
{'Charlie', 'Bob', 'Alice', 'Diana'}
{'Charlie', 'Bob', 'Alice', 'Diana'}

Interseção: encontre o que há em comum

A interseção retorna apenas os itens que aparecem nos dois conjuntos. Use o operador & ou .intersection().

A interseção encontra os itens em comum
math_students = {'Alice', 'Bob', 'Charlie'}
science_students = {'Bob', 'Diana', 'Charlie'}
# Intersection - students in BOTH classes
both_classes = math_students & science_students
print(both_classes) # {'Bob', 'Charlie'}
Saída
{'Bob', 'Charlie'}

Diferença: o que só existe em um conjunto

A diferença retorna os itens que estão no primeiro conjunto, mas não no segundo. Use o operador - ou .difference(). Aqui a ordem importa.

A diferença encontra os itens exclusivos de um conjunto
math_students = {'Alice', 'Bob', 'Charlie'}
science_students = {'Bob', 'Diana', 'Charlie'}
# Who is ONLY in math?
math_only = math_students - science_students
print(math_only) # {'Alice'}
# Who is ONLY in science?
science_only = science_students - math_students
print(science_only) # {'Diana'}
Saída
{'Alice'}
{'Diana'}

Diferença simétrica: itens em um, mas não nos dois

A diferença simétrica retorna os itens que estão em um ou outro conjunto, mas não nos dois. Pense nela como o oposto da interseção. Use o operador ^ ou .symmetric_difference().

A diferença simétrica exclui os itens compartilhados
math_students = {'Alice', 'Bob', 'Charlie'}
science_students = {'Bob', 'Diana', 'Charlie'}
# Students in only ONE class (not both)
exclusive = math_students ^ science_students
print(exclusive) # {'Alice', 'Diana'}
Saída
{'Alice', 'Diana'}

Como adicionar e remover itens de um conjunto

Os conjuntos são mutáveis, ou seja, você pode adicionar e remover itens depois de criá-los. Estes são os principais métodos que você vai usar.

Adicionando e removendo itens de um conjunto
fruits = {'apple', 'banana'}
# Add a single item
fruits.add('cherry')
print(fruits)
# Add multiple items at once
fruits.update(['date', 'elderberry'])
print(fruits)
# Remove an item (raises error if not found)
fruits.remove('banana')
print(fruits)
# Discard an item (no error if not found)
fruits.discard('mango') # No crash!
print(fruits)
Saída
{'apple', 'banana', 'cherry'}
{'date', 'elderberry', 'apple', 'banana', 'cherry'}
{'date', 'elderberry', 'apple', 'cherry'}
{'date', 'elderberry', 'apple', 'cherry'}

Você também pode apagar todos os itens ou retirar um item qualquer do conjunto (você não escolhe qual).

Os métodos pop e clear
numbers = {10, 20, 30, 40, 50}
# Pop removes and returns an arbitrary item
removed = numbers.pop()
print(f'Removed: {removed}')
print(f'Remaining: {numbers}')
# Clear removes everything
numbers.clear()
print(numbers) # set()
Saída
Removed: 50
Remaining: {20, 40, 10, 30}
set()

Por que os conjuntos são tão rápidos para testar se um item faz parte deles

Um dos melhores motivos para usar um conjunto é verificar se algo existe. A palavra-chave in funciona tanto com listas quanto com conjuntos, mas os conjuntos são muito mais rápidos.

Teste de pertencimento rápido com in
allowed_users = {'alice', 'bob', 'charlie', 'diana'}
user = 'bob'
if user in allowed_users:
print(f'{user} is allowed!')
else:
print(f'{user} is not allowed.')
# Checking who is NOT in the set
user2 = 'eve'
if user2 not in allowed_users:
print(f'{user2} is not on the list.')
Saída
bob is allowed!
eve is not on the list.

O que são frozensets?

Um frozenset é uma versão imutável de um conjunto. Depois de criado, não dá para adicionar nem remover itens. Isso torna os frozensets hashable (é possível calcular um hash deles), o que significa que eles podem ser usados como chaves de dicionário ou guardados dentro de outros conjuntos.

Frozensets são conjuntos imutáveis
# Create a frozenset
vowels = frozenset(['a', 'e', 'i', 'o', 'u'])
print(vowels)
# You can still do set operations
consonants = frozenset(['b', 'c', 'd', 'f', 'g'])
all_letters = vowels | consonants
print(all_letters)
# But you CANNOT modify it
# vowels.add('y') # AttributeError!
Saída
frozenset({'u', 'o', 'i', 'e', 'a'})
frozenset({'u', 'o', 'i', 'f', 'g', 'd', 'e', 'b', 'c', 'a'})

Quando usar um conjunto em vez de uma lista?

Conjuntos e listas resolvem problemas diferentes. Uma regra prática: se você se importa com a ordem ou com as duplicatas, use uma lista. Se você se importa com valores únicos ou buscas rápidas, use um conjunto.

Use uma lista quando...
# Order matters
playlist = ['song1', 'song2', 'song3']

# Duplicates are meaningful
die_rolls = [3, 5, 3, 2, 5, 6]

# You need index access
first = playlist[0]
Use um conjunto quando...
# Only unique items matter
tags = {'python', 'coding', 'tutorial'}

# Fast membership checks
if 'python' in tags:
    print('Found!')

# Removing duplicates
unique = set([1, 2, 2, 3, 3])

Exercícios práticos

Remova duplicatas de uma lista
Escreva o código

Você tem uma lista de endereços de e-mail em que alguns aparecem mais de uma vez. Crie um conjunto chamado unique_emails a partir da lista emails e exiba-o em ordem alfabética usando sorted().

emails = ['alice@mail.com', 'bob@mail.com', 'alice@mail.com', 'charlie@mail.com', 'bob@mail.com']
# Create a set of unique emails and print them sorted
Preveja a saída do conjunto
Preveja a saída

O que este código exibe? Pense com cuidado em como os conjuntos lidam com duplicatas e no que a função len() retorna.

data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique = set(data)
print(len(unique))

Escreva uma instrução print() com a saída exata.

# What does this code print?
data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique = set(data)
print(len(unique))
Encontre os alunos das duas turmas
Escreva o código

Você tem dois conjuntos: math e english. Encontre e exiba os alunos matriculados nas duas turmas. Exiba o resultado como uma lista ordenada.

math = {'Alice', 'Bob', 'Charlie', 'Diana'}
english = {'Bob', 'Diana', 'Eve', 'Frank'}
# Find students in both classes and print sorted
Corrija o bug do conjunto vazio
Corrija o erro

Este código tenta criar um conjunto vazio, adicionar itens a ele e exibir o resultado. Mas há um bug: quem escreveu o código usou {} para criar um conjunto vazio. Corrija o bug para que o código funcione.

# Bug: this creates a dictionary, not a set!
my_set = {}
my_set.add('python')
my_set.add('java')
my_set.add('python') # duplicate
print(sorted(my_set))
Encontre os ingredientes que faltam
Escreva o código

Você tem um conjunto recipe com todos os ingredientes necessários e um conjunto pantry com o que você já tem na despensa. Encontre os ingredientes que você ainda precisa comprar e exiba-os como uma lista ordenada.

recipe = {'flour', 'sugar', 'eggs', 'butter', 'vanilla'}
pantry = {'flour', 'eggs', 'salt', 'pepper'}
# Find and print what you need to buy (sorted)
Remova duplicatas mantendo a ordem
Escreva o código

Escreva uma função chamada dedupe(items) que remove as duplicatas de uma lista mantendo a ordem original. Use um conjunto para registrar quais itens você já viu. Retorne a lista sem duplicatas.

Teste a função chamando print(dedupe([3, 1, 4, 1, 5, 9, 2, 6, 5, 3])).

def dedupe(items):
# Use a set to track seen items
# Build a new list with only first occurrences
pass
print(dedupe([3, 1, 4, 1, 5, 9, 2, 6, 5, 3]))

Tutoriais relacionados

Este tutorial foi útil?