Matrizes
bidimensionais
O vetor ganhou uma dimensão. Agora os dados vivem em linhas × colunas — indexação [i][j], laços aninhados e a lógica de tabuleiros, tabelas e imagens.
O vetor ganhou uma dimensão. Agora os dados vivem em linhas × colunas — indexação [i][j], laços aninhados e a lógica de tabuleiros, tabelas e imagens.
Entender a matriz como uma estrutura de linhas × colunas
Declarar e acessar matrizes em Python com indexação [i][j]
Percorrer a matriz inteira com laços aninhados
Somar, preencher e processar dados por linha e por coluna
Se o vetor é uma fila (uma dimensão), a matriz é uma tabela — duas dimensões. Pense em um boletim: cada linha é um aluno, cada coluna é um bimestre.
notas[linha][coluna].
Dois índices, sempre nesta ordem: [linha][coluna]. Ambos começam no zero. Para pegar o 10 lá embaixo à direita: linha 2, coluna 2 → notas[2][2].
notas[2][0] (linha 2, coluna 0) vale 4, mas notas[0][2] (linha 0, coluna 2) vale 6. Linha primeiro, coluna depois — sempre.
Em Python, uma matriz é uma lista onde cada elemento é outra lista (uma linha). Colchetes dentro de colchetes.
notas = [
[7, 8, 6], # linha 0
[9, 5, 7], # linha 1
[4, 8, 10] # linha 2
]
print(notas[0]) # [7, 8, 6] → a linha 0 inteira
print(notas[2][2]) # 10 → linha 2, coluna 2
print(notas[1][0]) # 9 → linha 1, coluna 0
notas[1] devolve a lista da linha 1 ([9, 5, 7]); o segundo colchete escolhe um valor dentro dela. Por isso são dois []: o primeiro pega a linha, o segundo pega a coluna.
notas = [
[7, 8, 6],
[9, 5, 7],
[4, 8, 10]
]
linhas = len(notas) # 3
colunas = len(notas[0]) # 3
# Alterar uma célula
notas[0][1] = 9
# Acessar a última célula
ultima = notas[linhas - 1][colunas - 1]
print(ultima) # 10
| Quero saber… | Uso | Resultado |
|---|---|---|
| Nº de linhas | len(notas) | 3 |
| Nº de colunas | len(notas[0]) | 3 |
| Uma célula | notas[1][2] | 7 |
| Uma linha inteira | notas[1] | [9, 5, 7] |
Para visitar todas as células, um laço dentro do outro: o de fora anda pelas linhas, o de dentro anda pelas colunas daquela linha.
notas = [[7, 8, 6], [9, 5, 7], [4, 8, 10]]
for i in range(len(notas)): # i = linha
for j in range(len(notas[i])): # j = coluna
print("notas[", i, "][", j, "] =", notas[i][j])
Criamos uma matriz vazia e a preenchemos linha por linha. O truque é montar cada linha em uma lista temporária e depois adicioná-la à matriz.
matriz = []
linhas = int(input("Quantas linhas? "))
colunas = int(input("Quantas colunas? "))
for i in range(linhas):
linha = [] # nova linha vazia
for j in range(colunas):
valor = int(input(f"Valor [{i}][{j}]: "))
linha.append(valor) # preenche a coluna
matriz.append(linha) # adiciona a linha pronta
print(matriz)
append: linha.append fica no laço de dentro (uma coluna por vez); matriz.append(linha) fica no laço de fora (uma linha por vez, só depois de completa). Trocar isso quebra a estrutura.
Mesmo padrão de acumulador do vetor — só que agora dentro de dois laços.
notas = [[7, 8, 6], [9, 5, 7], [4, 8, 10]]
soma = 0
for i in range(len(notas)):
for j in range(len(notas[i])):
soma = soma + notas[i][j]
total_celulas = len(notas) * len(notas[0])
media_geral = soma / total_celulas
print("Soma total:", soma) # 64
print("Média geral:", round(media_geral, 2))
soma = 0 antes, atualiza dentro, usa depois. A única diferença é o laço duplo e o índice duplo notas[i][j].
Reiniciar o acumulador a cada linha dá um resultado por linha — a média de cada aluno do boletim, por exemplo.
for i in range(len(notas)):
soma_linha = 0 # zera A CADA linha
for j in range(len(notas[i])):
soma_linha += notas[i][j]
media = soma_linha / len(notas[i])
print("Aluno", i, "-> média", round(media, 1))
Na matriz notas = [[7, 8, 6], [9, 5, 7], [4, 8, 10]], quanto vale notas[1][2]?
notas[1] é a linha do meio, [9, 5, 7]. Dentro dela, a coluna 2 (a terceira, contando do zero) é o 7. Lembre: linha primeiro, coluna depois, ambos base 0.
Uma matriz onde cada linha é um aluno e cada coluna é um bimestre. O programa lê as notas e calcula a média de cada aluno e a média geral da turma.
Perguntem quantos alunos e quantos bimestres (colunas).
Preencham a matriz com laços aninhados e input, montando linha por linha.
Para cada aluno (linha), calculem e exibam a média individual.
Acumulem tudo para exibir a média geral da turma ao final.
Testem com 2 alunos e 3 bimestres e confiram as contas na mão.
alunos = int(input("Quantos alunos? "))
bimestres = int(input("Quantos bimestres? "))
boletim = []
for i in range(alunos):
linha = []
for j in range(bimestres):
linha.append(float(input(f"Aluno {i+1}, nota {j+1}: ")))
boletim.append(linha)
soma_geral = 0
for i in range(len(boletim)):
soma_aluno = 0
for j in range(len(boletim[i])):
soma_aluno += boletim[i][j]
soma_geral += soma_aluno
print(f"Aluno {i+1}: média {round(soma_aluno / bimestres, 1)}")
total = alunos * bimestres
print("Média geral da turma:", round(soma_geral / total, 2))
soma_aluno zera a cada linha (média individual); soma_geral só zera no começo (média da turma). É o padrão do vetor, agora em duas dimensões.
Com vetores e matrizes dominados, você tem as duas estruturas lineares que sustentam quase tudo em programação: listas de dados e tabelas de dados.
m = [[1,2],[3,4]] — lista de listas (linhas)m[i][j] — linha i, coluna j, ambos começam em 0len(m) — nº de linhas · len(m[0]) — nº de colunasfor i in range(len(m)): → dentro for j in range(len(m[i])):linha.append no laço interno, m.append(linha) no externoSEDUC-SP. Educação Profissional Paulista — Técnico em Desenvolvimento de Sistemas. Lógica de Programação, Componente 1 — Matrizes bidimensionais (Semana 16).
PYTHON SOFTWARE FOUNDATION. O tutorial do Python — 5. Estruturas de dados. Disponível em: docs.python.org. Acesso em: 6 abr. 2026.
ORESTES, Y. Listas em Python: operações básicas. Alura, 5 fev. 2026. Disponível em: alura.com.br. Acesso em: 6 abr. 2026.
Aula compilada · adaptação para apresentação HTML por Guilherme Antunes