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:
frutas = ["maçã", "banana", "manga"]
print(frutas[0], frutas[-1], frutas[0:2])
frutas[1] = "uva"
print(frutas)
maçã manga ['maçã', 'banana']
['maçã', 'uva', 'manga']
Métodos principais
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))
[0, 3, 1, 4, 1, 5, 9, 2, 6]
[0, 3, 4, 1, 5, 9, 2] 6
2 1
| Método | O que faz | Devolve |
|---|---|---|
append(x) | Adiciona no fim | None |
extend(iteravel) | Adiciona vários itens no fim | None |
insert(i, x) | Insere na posição i | None |
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 lugar | None |
reverse() | Inverte no lugar | None |
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:
valores = [3, 1, 2]
print(sorted(valores))
print(valores)
resultado = valores.sort()
print(resultado, valores)
valores.sort(reverse=True)
print(valores)
[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:
a = [1, 2, 3]
b = a
b.append(4)
print(a)
c = a.copy()
c.append(5)
print(a, c)
[1, 2, 3, 4]
[1, 2, 3, 4] [1, 2, 3, 4, 5]
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)
[[99, 2], [3, 4]]
[[99, 2], [3, 4]] [[0, 2], [3, 4]]
Operações úteis
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)
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:
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))
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.