Pular para o conteúdo

    Capítulo 19, Básico

    Listas

    A lista é a estrutura de dados que você mais vai usar. Entender o que é mutável nela evita os bugs mais difíceis de achar.

    Código deste capítulo: basico/cap19_listas.py

    Criar, acessar e fatiar

    Uma lista é uma sequência ordenada e mutável de itens de qualquer tipo. Os índices e as fatias funcionam como nas strings, mas aqui você pode alterar os itens:

    basico/cap19_listas.pylinhas 10 a 13
    frutas = ["maçã", "banana", "manga"]
    print(frutas[0], frutas[-1], frutas[0:2])
    frutas[1] = "uva"
    print(frutas)
    
    Saída
    maçã manga ['maçã', 'banana']
    ['maçã', 'uva', 'manga']
    

    Métodos principais

    basico/cap19_listas.pylinhas 18 a 26
    numeros = [3, 1, 4, 1, 5]
    numeros.append(9)
    numeros.insert(0, 0)
    numeros.extend([2, 6])
    print(numeros)
    numeros.remove(1)
    ultimo = numeros.pop()
    print(numeros, ultimo)
    print(numeros.index(4), numeros.count(1))
    
    Saída
    [0, 3, 1, 4, 1, 5, 9, 2, 6]
    [0, 3, 4, 1, 5, 9, 2] 6
    2 1
    
    MétodoO que fazDevolve
    append(x)Adiciona no fimNone
    extend(iteravel)Adiciona vários itens no fimNone
    insert(i, x)Insere na posição iNone
    remove(x)Remove a primeira ocorrência (ou ValueError)None
    pop(i)Remove e devolve o item (o último, por padrão)O item
    sort()Ordena no lugarNone
    reverse()Inverte no lugarNone

    Quase todos os métodos que alteram a lista devolvem None. O erro clássico é escrever lista = lista.sort() e ficar com None. Compare com sorted(), que devolve uma lista nova e não mexe na original:

    basico/cap19_listas.pylinhas 28 a 34
    valores = [3, 1, 2]
    print(sorted(valores))
    print(valores)
    resultado = valores.sort()
    print(resultado, valores)
    valores.sort(reverse=True)
    print(valores)
    
    Saída
    [1, 2, 3]
    [3, 1, 2]
    None [1, 2, 3]
    [3, 2, 1]
    

    Atribuir não é copiar

    b = a não cria uma lista nova: cria um segundo nome para a mesma lista. Para copiar, use copy(). E a cópia é rasa: os itens internos continuam compartilhados. Para listas dentro de listas, é preciso copy.deepcopy:

    basico/cap19_listas.pylinhas 39 a 45
    a = [1, 2, 3]
    b = a
    b.append(4)
    print(a)
    c = a.copy()
    c.append(5)
    print(a, c)
    
    Saída
    [1, 2, 3, 4]
    [1, 2, 3, 4] [1, 2, 3, 4, 5]
    
    basico/cap19_listas.pylinhas 47 a 55
    import copy
    
    matriz = [[1, 2], [3, 4]]
    rasa = matriz.copy()
    rasa[0][0] = 99
    print(matriz)
    profunda = copy.deepcopy(matriz)
    profunda[0][0] = 0
    print(matriz, profunda)
    
    Saída
    [[99, 2], [3, 4]]
    [[99, 2], [3, 4]] [[0, 2], [3, 4]]
    

    Operações úteis

    basico/cap19_listas.pylinhas 60 a 68
    n = [4, 8, 2, 9]
    print(len(n), min(n), max(n), sum(n))
    print(n + [1], n * 2)
    print(8 in n)
    print(list(reversed(n)))
    del n[0]
    print(n)
    n[1:3] = [0, 0, 0]
    print(n)
    
    Saída
    4 2 9 23
    [4, 8, 2, 9, 1] [4, 8, 2, 9, 4, 8, 2, 9]
    True
    [9, 2, 8, 4]
    [8, 2, 9]
    [8, 0, 0, 0]
    

    Pilha e fila

    Uma lista funciona bem como pilha (último a entrar, primeiro a sair), com append e pop no fim, que são rápidos. Como fila, ela é ruim: pop(0) precisa deslocar todos os itens. Para filas, use collections.deque:

    basico/cap19_listas.pylinhas 73 a 82
    from collections import deque
    
    pilha = []
    pilha.append("a")
    pilha.append("b")
    print(pilha.pop())
    
    fila = deque(["x", "y", "z"])
    fila.append("w")
    print(fila.popleft(), list(fila))
    
    Saída
    b
    x ['y', 'z', 'w']
    

    Exercício 1

    Segundo maior

    Escreva segundo_maior(numeros) que ignore repetições. Para [5, 5, 3] o resultado é 3. O próximo capítulo apresenta o set, que ajuda aqui.

    Exercício 2

    A lista está ordenada?

    Escreva esta_ordenada(numeros) sem usar sort() na lista original.