Listas
Uma variável guarda uma coisa. Uma lista guarda várias coisas em ordem, todas sob um único nome. Um placar é uma sequência ordenada de pontuações. Um quiz é uma coleção de perguntas. Assim que 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 ponto de partida que você constrói ao longo do tempo.
scores = [87, 92, 74, 65, 91]
players = ["Ana", "Bruno", "Carlos"]
mixed = ["Ana", 87, True, 3.14] # qualquer tipo, embora incomum
empty = []Indexação e fatiamento
Listas usam a mesma numeração das strings: as posições começam em 0, números negativos contam a partir do final. Você lê qualquer item pela 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 lançariam TypeError)Adicionando itens
Três métodos para adicionar itens. append() adiciona um único item ao 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 único item, gerando uma lista dentro de uma lista. Use extend() para mesclar:
scores.append([55, 71]) # [..., [55, 71]] lista aninhada, provavelmente errado
scores.extend([55, 71]) # [..., 55, 71] mesclado, corretoRemovendo itens
Quatro ferramentas para remover itens. remove() busca por valor. pop() remove por posição e te devolve o item. del remove por posição sem valor de retorno. clear() esvazia a lista inteira.
scores = [87, 92, 74, 65, 91]
scores.remove(74) # remove a primeira ocorrência de 74
scores.pop() # remove e retorna o último item (91)
scores.pop(0) # remove e retorna o item na posição 0 (87)
del scores[1] # remove na posição 1, sem valor de retorno
scores.clear() # remove tudoremove() lança um ValueError se o valor não estiver na lista. Verifique com in primeiro se não tiver certeza:
if 74 in scores:
scores.remove(74)Ordenação
sorted() retorna uma lista nova e ordenada e deixa a original intacta. .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 ordenadaOperações úteis
O Python tem um conjunto de ferramentas embutidas que funcionam diretamente com 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 lugarIterando
Um loop for percorre uma lista um item de cada vez. A variável após for recebe cada item por vez. Quando você também precisa da posição, enumerate() te dá ambos sem um contador manual.
players = ["Ana", "Bruno", "Carlos"]
for player in players:
print(player)
for i, player in enumerate(players, start=1):
print(f"{i}. {player}")
# 1. Ana
# 2. Bruno
# 3. Carlosloops for e enumerate
for e enumerate() são abordados em detalhes no capítulo Controle de fluxo. Versão curta: for player in players executa uma vez por item; enumerate() te dá tanto a posição quanto o valor a cada iteração.
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 escolhe a linha, o segundo escolhe 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)Mutabilidade: a armadilha
Isso surpreende quase todo mundo. Atribuir uma lista a uma nova variável não faz uma cópia. Os dois nomes apontam para a mesma lista. Mude um e você muda o outro. Para obter uma cópia independente, você precisa 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 a mesma coisa
# 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]] (a lista interna foi compartilhada)Mais métodos
| Método | O que faz |
|---|---|
.append(item) | Adiciona ao final |
.insert(i, item) | Insere na posição i |
.extend(iterable) | Adiciona todos os itens de um iterável |
.remove(value) | Remove a primeira ocorrência do valor |
.pop(i) | Remove e retorna o 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ções: adicionar resultados, ordená-los e imprimir 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 ordenadas: {scores}")
print(f"Maior: {scores[0]}")
print(f"Menor: {scores[-1]}")
print(f"Média: {sum(scores) / len(scores):.1f}")
print(f"Top 3: {scores[:3]}")
