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 questionário é uma coleção de perguntas. No momento em 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ê vai preenchendo com o tempo.
scores = [87, 92, 74, 65, 91]
players = ["Ana", "Bruno", "Carlos"]
mixed = ["Ana", 87, True, 3.14] # qualquer tipo, embora incomum
empty = [][] vazio é um bom ponto de partida quando você planeja preenchê-lo aos poucos. A maioria das minhas listas começa assim, vazias e esperando. Indexação e fatiamento
Listas usam a mesma numeração que strings: as posições começam em 0, números negativos contam a partir do final. Você lê qualquer item pela posição dele. 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 gerariam TypeError)0, e números negativos contam a partir do final, então scores[-1] é o último. Uma fatia como scores[1:3] entrega uma lista nova com as posições 1 e 2. A parte que me pegou de início: em uma lista você também pode escrever em uma posição, scores[0] = 90, algo que uma string recusaria. Adicionando itens
Três métodos para adicionar itens. append() adiciona um único item ao final e é o que você vai 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: usar append() com uma lista adiciona a lista inteira como um único item, criando uma lista dentro de outra 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() encaixa um item no final e é o que você vai usar quase sempre. insert() coloca um item em uma posição, extend() mescla outra lista. O deslize clássico: usar append() com uma lista gera uma lista dentro da 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 devolve o item removido. del remove por posição sem devolver nada. 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 devolve o último item (91)
scores.pop(0) # remove e devolve o item na posição 0 (87)
del scores[1] # remove na posição 1, sem valor de retorno
scores.clear() # remove tudoremove() gera um ValueError se o valor não estiver na lista. Verifique com in antes se não tiver certeza:
if 74 in scores:
scores.remove(74)remove() remove por valor e apenas a primeira correspondência, e gera ValueError se o valor não estiver lá, então verifique com in antes quando não tiver certeza. pop() remove por posição e devolve o item, del remove por posição e não devolve nada. Ordenação
sorted() devolve uma lista nova e ordenada e deixa a original intacta. .sort() ordena a lista no próprio lugar e devolve None. Essa diferença importa mais do que parece.
scores = [87, 42, 96, 55, 71]
ranked = sorted(scores) # [42, 55, 71, 87, 96] (lista nova)
scores.sort() # ordena no próprio lugar, devolve None
scores.sort(reverse=True) # [96, 87, 71, 55, 42]
result = scores.sort() # result é None, não a lista ordenadasorted() te dá uma lista nova e ordenada e deixa a original intacta. .sort() rearranja a própria lista e devolve None, então x = scores.sort() te deixa com None, não a lista. Eu caí nesse mesmo erro mais de uma vez até fixar. Operações úteis
O Python tem um conjunto de ferramentas embutidas que funcionam diretamente em listas. len(), sum(), min() e max() são as quatro que você vai 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 superficial
scores.reverse() # inverte no próprio lugarlen(), sum(), min() e max() funcionam direto em uma lista, sem preparo. in pergunta se algo está presente, .count() conta quantas vezes, e .index() encontra a posição da primeira correspondência. Iterando
Um loop for percorre uma lista item por item. A variável depois de for recebe cada item, um por vez. Quando você também precisa da posição, enumerate() te dá as duas coisas sem precisar de 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. Carlosfor e enumerate() recebem tratamento completo no capítulo Controle de fluxo. Em resumo: for player in players executa uma vez por item, e enumerate() te dá tanto a posição quanto o valor em cada iteração.
for percorre a lista item por item, e o nome depois de for se torna esse item em cada volta. Quando você quer a posição também, enumerate() te dá as duas coisas, então você nunca precisa manter um contador sozinho. Deixar ele contar por mim me poupou vários erros de contagem. 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)grid[1][2], o primeiro escolhe a linha, o segundo escolhe dentro dela. Mutabilidade: a pegadinha
Isso surpreende quase todo mundo. Atribuir uma lista a uma nova variável não cria uma cópia. Os dois nomes apontam para a mesma lista. Mude um e você muda o outro. Para ter uma cópia independente, você precisa pedir uma explicitamente.
a = [1, 2, 3]
b = a # b não é uma cópia; ele 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]] (a lista interna era compartilhada)b = a não cria uma cópia, os dois nomes apontam para a mesma lista, então uma mudança feita por um aparece através do outro. Para uma lista independente você precisa pedir: .copy(), list(a), ou a[:]. Isso surpreende quase todo mundo na primeira vez, eu incluído. 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 devolve o item na posição i (padrão: 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 próprio lugar |
.reverse() | Inverte no próprio lugar |
.copy() | Devolve uma cópia superficial |
Na prática
Construindo um rastreador de pontuações: 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 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]}")
