Listas

Uma variável guarda uma coisa. Uma lista guarda muitas coisas em ordem, todas sob um único nome. Um ranking é uma sequência ordenada de pontuações. Um quiz é uma coleção de perguntas. Quando você precisa gerenciar um grupo de valores relacionados, você precisa de uma lista.
Criando uma lista
Colchetes, valores separados por vírgulas. Listas podem conter qualquer mistura de tipos, e uma lista vazia é válida e comum como um ponto de partida que você constrói ao longo do tempo.
scores = [87, 92, 74, 65, 91]
players = ["Maria", "João", "Carlos"]
mixed = ["Maria", 87, True, 3.14] # qualquer tipo, embora incomum
empty = [][] vazio é um bom ponto de partida quando você planeja preenchê-lo conforme avança. A maioria das minhas listas começa assim, vazia e esperando. Indexação e fatiamento
Listas usam a mesma numeração que strings: posições começam em 0, números negativos contam a partir do final. Você lê qualquer item por sua posição. Como listas são mutáveis, você também pode escrever em uma posição específica.
scores = [87, 92, 74, 65, 91]
scores[0] # 87 (primeiro)
scores[-1] # 91 (último)
scores[1:3] # [92, 74]
scores[:2] # [87, 92]
scores[::-1] # [91, 65, 74, 92, 87] (invertido)
scores[0] = 90 # mutável: funciona (strings levantariam TypeError)0, e números negativos contam de trás para frente a partir do final, então scores[-1] é o último. Um fatiamento como scores[1:3] lhe entrega uma lista fresca com posições 1 e 2. A parte que me levou um momento: com uma lista você também pode escrever em uma posição, scores[0] = 90, onde uma string se recusaria. Adicionando itens
Três métodos para adicionar itens. append() adiciona um único item no final e é o que você usará quase sempre. insert() adiciona em uma posição específica. extend() mescla outra lista.
scores = [87, 92, 74]
scores.append(65) # [87, 92, 74, 65]
scores.insert(1, 100) # [87, 100, 92, 74, 65]
scores.extend([55, 71]) # [87, 100, 92, 74, 65, 55, 71]Um erro comum: append() com uma lista adiciona a lista inteira como um item, dando-lhe uma lista dentro de uma lista. Use extend() para mesclar em vez disso:
scores.append([55, 71]) # [..., [55, 71]] lista aninhada, provavelmente errado
scores.extend([55, 71]) # [..., 55, 71] mesclado, corretoappend() coloca um item no final e é o que você praticamente sempre usará. insert() coloca um item em uma posição, extend() mescla outra lista. O deslize clássico: append() uma lista e você obtém uma lista dentro de sua lista, então use extend() quando quiser mesclar. Removendo itens
Quatro ferramentas para remover itens. remove() busca por valor. pop() remove por posição e lhe entrega o item. del remove por posição sem um valor de retorno. clear() esvazia a lista inteira.
scores = [87, 92, 74, 65, 91]
scores.remove(74) # remove primeira ocorrência de 74
scores.pop() # remove e retorna último item (91)
scores.pop(0) # remove e retorna item na posição 0 (87)
del scores[1] # remove na posição 1, sem valor de retorno
scores.clear() # remove tudoremove() levanta ValueError se o valor não estiver na lista. Verifique com in primeiro se você não tem certeza:
if 74 in scores:
scores.remove(74)remove() deleta por valor e apenas a primeira correspondência, e levanta ValueError se o valor não estiver lá, então verifique com in primeiro quando não tem certeza. pop() remove por posição e entrega o item, del remove por posição e não lhe entrega nada. Ordenação
sorted() retorna uma lista completamente nova e ordenada e deixa sua original intocada. .sort() ordena a lista no lugar e retorna None. Essa diferença importa mais do que parece.
scores = [87, 42, 96, 55, 71]
ranked = sorted(scores) # [42, 55, 71, 87, 96] (nova lista)
scores.sort() # ordena no lugar, retorna None
scores.sort(reverse=True) # [96, 87, 71, 55, 42]
result = scores.sort() # result é None, não a lista ordenadasorted() lhe dá uma nova lista ordenada e deixa o original sozinho. .sort() reorganiza a lista em si e retorna None, então x = scores.sort() lhe deixa com None, não a lista. Cometi exatamente esse erro mais de uma vez antes de ficar. Operações úteis
Python tem um conjunto de ferramentas integradas que funcionam diretamente em listas. len(), sum(), min() e max() são as quatro que você usará constantemente.
scores = [87, 92, 74, 65, 91]
len(scores) # 5
sum(scores) # 409
min(scores) # 65
max(scores) # 92
scores.count(87) # 1
scores.index(74) # 2
74 in scores # True
74 not in scores # False
scores.copy() # cópia rasa
scores.reverse() # inverte no lugarlen(), sum(), min() e max() todos funcionam direto em uma lista, sem setup. in pergunta se algo está presente, .count() totaliza quantas vezes, e .index() encontra a posição da primeira correspondência. Iterando
Um loop for passa por uma lista um item por vez. A variável depois de for recebe cada item por vez. Quando você também precisa da posição, enumerate() lhe dá ambas sem um contador manual.
players = ["Maria", "João", "Carlos"]
for player in players:
print(player)
for i, player in enumerate(players, start=1):
print(f"{i}. {player}")
# 1. Maria
# 2. João
# 3. Carlosfor e enumerate() recebem tratamento completo no capítulo Fluxo de controle. A versão curta: for player in players é executado uma vez por item, e enumerate() lhe dá tanto a posição quanto o valor a cada iteração.
for caminha pela lista um item por vez, e o nome depois de for se torna esse item cada vez. Quando quer a posição também, enumerate() lhe entrega ambas, então você nunca precisa manter um contador você mesmo. Deixá-lo contar para mim me salvou de um monte de erros off-by-one. Listas aninhadas
Uma lista pode conter outras listas. É assim que você representa uma grade ou uma tabela: uma lista de linhas, cada linha sendo uma lista de valores. Dois conjuntos de colchetes acessam um item: o primeiro pega a linha, o segundo pega a coluna.
grid = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
grid[0] # [1, 2, 3]
grid[1][2] # 6 (linha 1, coluna 2)grid[1][2], o primeiro pega a linha, o segundo pega dela. Mutabilidade: a armadilha
Isso surpreende quase todos. Atribuir uma lista a uma nova variável não faz uma cópia. Ambos os nomes apontam para a mesma lista. Mude um e você muda o outro. Para obter uma cópia independente, você tem que pedir explicitamente.
a = [1, 2, 3]
b = a # b não é uma cópia; aponta para a mesma lista
b.append(4)
print(a) # [1, 2, 3, 4] (mudou: a e b são a mesma lista)b = a.copy() # cópia independente
b = list(a) # mesmo resultado
b = a[:] # também o mesmo
# Listas aninhadas ainda compartilham seus objetos internos:
matrix = [[1, 2], [3, 4]]
copy = matrix.copy()
copy[0].append(99)
print(matrix) # [[1, 2, 99], [3, 4]] (lista interna foi compartilhada)b = a não faz uma cópia, ambos os nomes apontam para a mesma lista, então uma mudança através de um mostra através da outra. Para uma lista independente você tem que pedir: .copy(), list(a) ou a[:]. Este pega quase todos de primeira, eu incluído. Mais métodos
| Método | O que faz |
|---|---|
.append(item) | Adiciona no final |
.insert(i, item) | Insere na posição i |
.extend(iterable) | Adiciona todos os itens de um iterável |
.remove(value) | Remove primeira ocorrência do valor |
.pop(i) | Remove e retorna item na posição i (padrão: último) |
.clear() | Remove todos os itens |
.index(value) | Posição da primeira ocorrência |
.count(value) | Número de ocorrências |
.sort() | Ordena no lugar |
.reverse() | Inverte no lugar |
.copy() | Retorna uma cópia rasa |
Na prática
Construindo um rastreador de pontuação: adicione resultados, ordene-os e imprima um resumo.
scores = []
scores.append(87)
scores.append(54)
scores.append(92)
scores.append(67)
scores.append(45)
scores.sort(reverse=True)
print(f"Pontuações classificadas: {scores}")
print(f"Mais alta: {scores[0]}")
print(f"Mais baixa: {scores[-1]}")
print(f"Média: {sum(scores) / len(scores):.1f}")
print(f"Top 3: {scores[:3]}")
