Pular para o conteúdo

    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):

    basico/cap20_tuplas_conjuntos.pylinhas 10 a 15
    dias = ("seg", "ter", "qua")
    print(dias[0], len(dias))
    try:
        dias[0] = "dom"
    except TypeError as erro:
        print(erro)
    
    Saída
    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:

    basico/cap20_tuplas_conjuntos.pylinhas 17 a 19
    um = (1,)
    nao_tupla = (1)
    print(type(um), type(nao_tupla))
    
    Saída
    <class 'tuple'> <class 'int'>
    

    O desempacotamento é onde a tupla mais aparece. O * captura "o resto" em uma lista:

    basico/cap20_tuplas_conjuntos.pylinhas 21 a 25
    ponto = (3, 4)
    x, y = ponto
    primeiro, *resto = [10, 20, 30, 40]
    print(x, y)
    print(primeiro, resto)
    
    Saída
    3 4
    10 [20, 30, 40]
    

    Quando você quer uma tupla com nomes nos campos, use namedtuple:

    basico/cap20_tuplas_conjuntos.pylinhas 27 a 31
    from collections import namedtuple
    
    Ponto = namedtuple("Ponto", ["x", "y"])
    p = Ponto(3, 4)
    print(p, p.x + p.y)
    
    Saída
    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:

    basico/cap20_tuplas_conjuntos.pylinhas 33 a 35
    registro = ("ana", [1, 2])
    registro[1].append(3)
    print(registro)
    
    Saída
    ('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:

    basico/cap20_tuplas_conjuntos.pylinhas 40 a 47
    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)
    
    Saída
    {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:

    basico/cap20_tuplas_conjuntos.pylinhas 49 a 55
    try:
        {[1, 2]}
    except TypeError as erro:
        print(erro)
    
    congelado = frozenset([1, 2])
    print(congelado)
    
    Saída
    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, use sorted(conjunto).

    Qual estrutura usar

    Eu preciso de...Uso
    Itens em ordem que podem mudarlist
    Um registro fixo, ou uma chave compostatuple
    Remover duplicatas e testar pertencimento rápidoset
    Associar valores a chavesdict (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.