Capítulo 20, Básico
Tuplas e conjuntos
A tupla é a lista que não muda. O conjunto é a coleção que não repete. Cada uma resolve um problema que a lista resolve mal.
Código deste capítulo: basico/cap20_tuplas_conjuntos.py
Tuplas
Uma tupla é uma sequência imutável. Use para dados que formam um registro fixo (coordenadas, pares de valores, retornos de função):
dias = ("seg", "ter", "qua")
print(dias[0], len(dias))
try:
dias[0] = "dom"
except TypeError as erro:
print(erro)
seg 3
'tuple' object does not support item assignment
Uma pegadinha de sintaxe: o que forma a tupla é a vírgula, não o parêntese. Uma tupla de um elemento precisa da vírgula final:
um = (1,)
nao_tupla = (1)
print(type(um), type(nao_tupla))
<class 'tuple'> <class 'int'>
O desempacotamento é onde a tupla mais aparece. O * captura "o resto" em uma lista:
ponto = (3, 4)
x, y = ponto
primeiro, *resto = [10, 20, 30, 40]
print(x, y)
print(primeiro, resto)
3 4
10 [20, 30, 40]
Quando você quer uma tupla com nomes nos campos, use namedtuple:
from collections import namedtuple
Ponto = namedtuple("Ponto", ["x", "y"])
p = Ponto(3, 4)
print(p, p.x + p.y)
Ponto(x=3, y=4) 7
A imutabilidade da tupla é rasa: ela garante que os itens não sejam trocados, mas se um item for mutável, ele continua podendo mudar:
registro = ("ana", [1, 2])
registro[1].append(3)
print(registro)
('ana', [1, 2, 3])
Conjuntos
Um conjunto guarda itens únicos, sem ordem garantida, e responde "este item está aqui?" em tempo praticamente constante. As operações seguem a teoria dos conjuntos:
s = {1, 2, 2, 3, 3, 3}
print(s, len(s))
vazio = set()
print(type({}), type(vazio))
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a | b, a & b, a - b, a ^ b)
print(3 in a)
{1, 2, 3} 3
<class 'dict'> <class 'set'>
{1, 2, 3, 4, 5, 6} {3, 4} {1, 2} {1, 2, 5, 6}
True
{} cria um dicionário vazio, não um conjunto. Para um conjunto vazio, use set().
Os itens de um conjunto precisam ser hashable, o que na prática significa imutáveis. Uma lista não pode entrar, mas uma tupla pode. O frozenset é a versão imutável do conjunto:
try:
{[1, 2]}
except TypeError as erro:
print(erro)
congelado = frozenset([1, 2])
print(congelado)
unhashable type: 'list'
frozenset({1, 2})
A ordem de um conjunto não é garantida
Um conjunto não tem posição, então não existe
s[0]. A ordem em que ele imprime pode mudar entre execuções, principalmente com strings. Se você precisa de ordem, usesorted(conjunto).
Qual estrutura usar
| Eu preciso de... | Uso |
|---|---|
| Itens em ordem que podem mudar | list |
| Um registro fixo, ou uma chave composta | tuple |
| Remover duplicatas e testar pertencimento rápido | set |
| Associar valores a chaves | dict (próximo capítulo) |
Exercício 1
Remover duplicatas preservando a ordem
Escreva sem_duplicados(itens). Para [3, 1, 3, 2, 1] o resultado é [3, 1, 2].
Exercício 2
Itens em comum
Escreva em_comum(a, b) que devolva, ordenados, os itens presentes nas duas listas.