01 / 16
Lógica de Programação · Aula compilada · Dia 2 de 2

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.

ProfessorGuilherme Antunes CursoTécnico em Desenvolvimento de Sistemas Duração50 minutos
02 / 16
Objetivos da aula

Ao final, você será capaz de.

01

Entender a matriz como uma estrutura de linhas × colunas

02

Declarar e acessar matrizes em Python com indexação [i][j]

03

Percorrer a matriz inteira com laços aninhados

04

Somar, preencher e processar dados por linha e por coluna

03 / 16
Conceito

Do vetor à matriz

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.

linha 0linha 1linha 2
col 0col 1col 2
7
8
6
9
5
7
4
8
10
Matriz 3 × 3: 3 linhas e 3 colunas. Cada célula é localizada por dois índices: primeiro a linha, depois a coluna — notas[linha][coluna].
04 / 16
A regra das duas dimensões

Indexação [i][j]

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].

i = 0i = 1i = 2
j = 0j = 1j = 2
7[0][0]
8[0][1]
6[0][2]
9[1][0]
5[1][1]
7[1][2]
4[2][0]
8[2][1]
10[2][2]
Nunca inverta a ordem: notas[2][0] (linha 2, coluna 0) vale 4, mas notas[0][2] (linha 0, coluna 2) vale 6. Linha primeiro, coluna depois — sempre.
05 / 16
Sintaxe em Python

Matriz é uma lista de listas

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
Leia com calma: 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.
06 / 16
Descobrindo as dimensões

Quantas linhas e colunas?

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…UsoResultado
Nº de linhaslen(notas)3
Nº de colunaslen(notas[0])3
Uma célulanotas[1][2]7
Uma linha inteiranotas[1][9, 5, 7]
07 / 16
Percurso da matriz

Laços aninhados

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])
A ordem da visita: preenche a linha 0 inteira ([0][0], [0][1], [0][2]), depois passa para a linha 1, e assim por diante. Com 3 linhas × 3 colunas = 9 células visitadas — o laço de dentro roda por completo a cada volta do de fora.
08 / 16
Entrada de dados

Preencher lendo do usuário

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)
Atenção ao lugar do 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.
09 / 16
Processando a matriz

Somar todos os elementos

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))
O acumulador é o mesmo do vetorsoma = 0 antes, atualiza dentro, usa depois. A única diferença é o laço duplo e o índice duplo notas[i][j].
10 / 16
Processando por linha

A média de cada linha

Reiniciar o acumulador a cada linha dá um resultado por linha — a média de cada aluno do boletim, por exemplo.

aluno 0aluno 1aluno 2
b1b2b3
7
8
6
9
5
7
4
8
10
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))
11 / 16
Pause e responda

O que devolve notas[1][2]?

Na matriz notas = [[7, 8, 6], [9, 5, 7], [4, 8, 10]], quanto vale notas[1][2]?

A8 — a segunda linha, segunda coluna
B7 — linha 1, coluna 2
C6 — porque conta a partir do 1
DErro — o índice não existe
Por que 7: 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.
12 / 16
Desafio · individual

Desafio: boletim da turma

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.

1

Perguntem quantos alunos e quantos bimestres (colunas).

2

Preencham a matriz com laços aninhados e input, montando linha por linha.

3

Para cada aluno (linha), calculem e exibam a média individual.

4

Acumulem tudo para exibir a média geral da turma ao final.

5

Testem com 2 alunos e 3 bimestres e confiram as contas na mão.

Esbocem no papel: quem é a linha, quem é a coluna, e onde o acumulador precisa zerar (a cada aluno). O código completo está no próximo slide.
13 / 16
Desafio · Como fica o código

Boletim funcionando

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))
Dois acumuladores: 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.
14 / 16
Então ficamos assim…

O que vimos hoje

  • Matriz → estrutura de duas dimensões: linhas × colunas (lista de listas)
  • Indexação [i][j] → linha primeiro, coluna depois, ambos base 0
  • len(m) e len(m[0]) → nº de linhas e nº de colunas
  • Laços aninhados → o de fora nas linhas, o de dentro nas colunas
  • Acumulador → mesmo padrão do vetor; zere no lugar certo (geral ou por linha)
Fechamento

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.

15 / 16
Cola de bolso

Matriz em seis linhas

  • m = [[1,2],[3,4]] — lista de listas (linhas)
  • m[i][j]linha i, coluna j, ambos começam em 0
  • len(m) — nº de linhas  ·  len(m[0]) — nº de colunas
  • for i in range(len(m)): → dentro for j in range(len(m[i])):
  • Preencher: linha.append no laço interno, m.append(linha) no externo
  • Média por linha = acumulador que zera a cada linha
Matriz nada mais é que vetor de vetores. Se você entende o percurso de um vetor, entende o de uma matriz — só dobrou o laço e o índice.
16 / 16
Referências

De onde veio cada coisa

SEDUC-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