Trilha de aprendizado · Nível 3 · Tutorial 8

Consultar e atualizar coleções aninhadas

Representar dados em mais de um nível e localizar, modificar ou extrair informações de combinações de listas e dicionários.

  • Nível: Iniciante
  • Duração: 20 min
  • 7 passos
Consultar e atualizar coleções aninhadas

O que você vai percorrer

  1. Representar dados em mais de um nível Organize tabelas, registros e grupos usando listas e dicionários dentro de outras coleções. 3 min
  2. Seguir o caminho até um valor Combine índices e chaves para consultar valores internos, conferindo o tipo e os limites de cada nível. 3 min
  3. Atualizar somente o valor desejado Use o caminho completo na atribuição e confira se apenas o valor interno foi alterado. 3 min
  4. Percorrer dois níveis com laços Use um laço para selecionar cada linha e outro para visitar seus valores, acompanhando a ordem de execução. 3 min
  5. Acompanhar linhas e colunas com enumerate Use enumerate nos dois laços para obter coordenadas e atualizar uma célula sem alterar as demais. 3 min
  6. Extrair valores para uma nova lista Extraia campos de registros e reúna valores de coleções em dois níveis, preservando a ordem e as repetições. 3 min
  7. Aplicar e revisar o percurso completo Integre consulta, atualização, localização por coordenadas e extração em uma tarefa no seu computador. 4 min

O que você vai aprender

  • Representar tabelas e registros usando combinações de listas e dicionários.
  • Identificar a sequência de índices e chaves necessária para alcançar um valor interno.
  • Atualizar um valor interno sem substituir indevidamente a coleção que o contém.
  • Percorrer estruturas em dois níveis com laços aninhados e acompanhar as posições quando necessário.
  • Extrair valores de uma estrutura aninhada para uma lista de resultados.

Antes de começar

  • Consultar e atualizar dados com dicionários
  • Percorrer sequências com enumerate e zip

Passo 1 de 7

Representar dados em mais de um nível

Organize tabelas, registros e grupos usando listas e dicionários dentro de outras coleções.

Uma coleção dentro de outra

Uma coleção é aninhada quando contém outras coleções. Para representar uma tabela, podemos usar uma lista de listas: a lista externa reúne as linhas, e cada lista interna contém os valores de uma linha.

Quantidades em duas linhas

Em cada linha, a primeira coluna representa cadernos e a segunda, canetas. Os colchetes mais externos envolvem a tabela inteira.

python
quantidades = [
    [3, 1],
    [4, 2]
]
Uma caixa externa contém duas caixas horizontais. A primeira contém os valores 3 e 1; a segunda, 4 e 2. Cada caixa horizontal representa uma lista interna, ou linha da tabela.

Uma lista externa, duas listas internas e dois valores em cada linha.

Construa a segunda linha

Complete a lacuna com um literal de lista contendo 4 e 2, nessa ordem.

quantidades = [
    [3, 1],
    ___
]

Registros e grupos

O tipo de coleção pode mudar de um nível para outro. Use uma lista de dicionários para reunir registros com campos nomeados. Use um dicionário de listas para reunir sequências sob chaves de grupo.

Lista de dicionários: um registro por produto

Os colchetes externos reúnem os registros. Cada par de chaves { } delimita um dicionário com os campos de um produto.

python
produtos = [
    {"nome": "caderno", "quantidade": 3},
    {"nome": "caneta", "quantidade": 1}
]

Dicionário de listas: uma sequência por categoria

As chaves externas { } delimitam o dicionário. Cada chave de categoria está associada a uma lista delimitada por colchetes.

python
materiais = {
    "papelaria": ["caderno", "caneta"],
    "limpeza": ["sabão", "esponja"]
}

Escolha a organização

Associe cada necessidade à forma de aninhamento mais adequada.

Toque em um item e depois no par correspondente.

Passo 2 de 7

Seguir o caminho até um valor

Combine índices e chaves para consultar valores internos, conferindo o tipo e os limites de cada nível.

Um acesso de cada vez

Leia os acessos da esquerda para a direita. O primeiro par de colchetes seleciona uma coleção interna; o seguinte consulta essa coleção. Se o resultado intermediário é uma lista, use um índice. Se é um dicionário, use uma chave.

Três caminhos possíveis

Observe nos comentários o resultado de cada acesso intermediário.

python
tabela = [[4, 7], [2, 9]]
pessoas = [{"nome": "Bia"}, {"nome": "Caio"}]
grupos = {"arte": ["papel", "tinta"]}

# tabela[1] → lista [2, 9]
print(tabela[1][0])           # 2

# pessoas[0] → dicionário {"nome": "Bia"}
print(pessoas[0]["nome"])    # Bia

# grupos["arte"] → lista ["papel", "tinta"]
print(grupos["arte"][1])     # tinta

O caminho acompanha a estrutura

Três caminhos: tabela passa por [1], chega à lista [2, 9] e, por [0], chega a 2; pessoas passa por [0], chega ao dicionário com nome Bia e, por ["nome"], chega a Bia; grupos passa por ["arte"], chega à lista de papel e tinta e, por [1], chega a tinta.

Cada seta representa um par de colchetes. O segundo acesso atua sobre o resultado do primeiro.

O que existe no meio do caminho?

Considere os dados abaixo e relacione cada consulta ao resultado intermediário.

tabela = [[4, 7], [2, 9]]
pessoas = [{"nome": "Bia"}, {"nome": "Caio"}]
grupos = {"arte": ["papel", "tinta"]}

Toque em um item e depois no par correspondente.

Confira cada nível

Uma chave válida no nível externo não garante que a posição interna exista. Para índices não negativos, confira se o índice é menor que o comprimento da lista interna — não o da coleção externa.

Chave e posição precisam existir

Aqui, a chave existe, mas sua lista não tem a posição 1.

python
grupos = {"arte": ["papel"]}

if "arte" in grupos:
    if 1 < len(grupos["arte"]):
        print(grupos["arte"][1])
    else:
        print("A lista não tem a posição 1.")
else:
    print("A chave arte não existe.")

Dica

Se tabela = [[4, 7], [2]], tabela[1] existe, mas tabela[1][1] não: a segunda linha só tem a posição 0. Confira os limites da coleção alcançada em cada acesso.

Complete os três caminhos

Índice → índice

Com tabela = [[4, 7], [2, 9]], complete para obter 9:

tabela[1][___]

Índice → chave

Com pessoas = [{"nome": "Bia"}, {"nome": "Caio"}], complete para obter "Caio". Digite apenas o texto entre as aspas:

pessoas[1]["___"]

Chave → índice

Com grupos = {"arte": ["papel", "tinta"]}, complete para obter "papel":

grupos["arte"][___]

Passo 3 de 7

Atualizar somente o valor desejado

Use o caminho completo na atribuição e confira se apenas o valor interno foi alterado.

O caminho completo é o destino

O caminho usado para consultar um valor também pode ficar à esquerda de = para atualizá-lo. Em tabela[1][1] = 9, o primeiro índice seleciona a linha; o segundo, a célula que receberá 9. Se você parar em tabela[1] = 9, substituirá a linha inteira pelo número.

Alterar uma célula

python
tabela = [[4, 7], [2, 5]]

print("Antes:", tabela)
tabela[1][1] = 9
print("Depois:", tabela)
# Antes: [[4, 7], [2, 5]]
# Depois: [[4, 7], [2, 9]]
Comparação de duas tabelas com duas linhas e duas colunas. Antes: primeira linha 4 e 7, segunda linha 2 e 5. Depois: primeira linha 4 e 7, segunda linha 2 e 9. Só a célula inferior direita muda.

A linha de índice 1 continua sendo uma lista: apenas sua posição de índice 1 passa de 5 para 9.

Até onde a atribuição deve ir?

Considere tabela = [[4, 7], [2, 5]]. Qual atribuição troca apenas o número 2 por 8?

A mesma regra com chaves

Em uma lista de dicionários, use índice + chave para alterar um campo. Em um dicionário de listas, use chave + índice para alterar uma posição interna. Nos dois casos, parar após o primeiro acesso substituiria a coleção interna inteira.

Dois alvos, duas atualizações pontuais

Este exemplo está completo e pode ser executado no seu Python. Os comandos print permitem comparar cada estrutura antes e depois.

python
produtos = [
    {"nome": "caderno", "quantidade": 3},
    {"nome": "caneta", "quantidade": 8}
]
entregas = {"segunda": [3, 8], "terca": [2, 6]}

print("Produtos antes:", produtos)
print("Entregas antes:", entregas)

produtos[1]["quantidade"] = 10
entregas["segunda"][0] = 5

print("Produtos depois:", produtos)
print("Entregas depois:", entregas)

Dica

Confira também o que não mudou

Ver o novo valor não basta: confira se os nomes, os outros números e as coleções que contêm os alvos continuam presentes.

Execute e confira

No editor ou terminal Python do seu computador, execute o exemplo da tela anterior. Compare as saídas: quais dois valores mudaram? Cite também dados que permaneceram iguais em cada estrutura.

Escreva pelo menos 40 caracteres (0/40).

Passo 4 de 7

Percorrer dois níveis com laços

Use um laço para selecionar cada linha e outro para visitar seus valores, acompanhando a ordem de execução.

Uma linha por vez

Para visitar todos os valores, combine dois laços: o externo seleciona uma lista interna e a coloca em linha; o interno percorre os valores dessa linha.

O laço interno termina seu percurso antes de o externo selecionar a próxima linha.

Dois níveis de percurso

python
tabela = [[4, 7], [2, 9]]

for linha in tabela:
    for valor in linha:
        print(valor)

# Saída, um valor por linha:
# 4
# 7
# 2
# 9
Duas linhas: a primeira contém 4 e 7; a segunda, 2 e 9. Setas mostram o percurso de 4 para 7, depois de 7 para 2 e de 2 para 9.

Primeiro são visitados todos os valores de [4, 7]; depois, os de [2, 9].

Preveja a ordem

Agora considere tabela = [[6, 1], [8, 3]]. Usando os mesmos dois laços do exemplo anterior, em que ordem os valores serão impressos?

  1. 6
  2. 8
  3. 1
  4. 3

Indentação e linhas de tamanhos diferentes

Cada linha é percorrida conforme seu próprio comprimento: elas não precisam ter a mesma quantidade de valores.

No código abaixo, print(valor) está dentro dos dois laços. Já print("Fim da linha") está dentro apenas do externo: ele executa uma vez por linha, depois que o laço interno termina.

Observe os recuos

Se quiser conferir, execute este código no seu Python.

python
tabela = [[6, 8], [3], [5, 1]]

for linha in tabela:
    for valor in linha:
        print(valor)
    print("Fim da linha")

Exemplo

Rastreamento de cada execução de print(valor)

| Execução | linha | valor |
| --- | --- | --- |
| 1ª | [6, 8] | 6 |
| 2ª | [6, 8] | 8 |
| 3ª | [3] | 3 |
| 4ª | [5, 1] | 5 |
| 5ª | [5, 1] | 1 |

A variável linha permanece com a mesma lista durante todo o percurso interno. A mensagem Fim da linha aparece depois de 8, depois de 3 e depois de 1.

Explique a passagem entre linhas

No código anterior, tabela = [[6, 8], [3], [5, 1]]. Explique o que acontece entre a impressão de 3 e a impressão de 5. Inclua a mensagem exibida e diga por que o laço interno termina após o 3.

Escreva pelo menos 30 caracteres (0/30).

Passo 5 de 7

Acompanhar linhas e colunas com enumerate

Use enumerate nos dois laços para obter coordenadas e atualizar uma célula sem alterar as demais.

Uma posição em cada nível

Nos dois laços, enumerate permite acompanhar as posições: o externo fornece i, índice da linha; o interno fornece j, índice da coluna na linha atual. Assim, o valor visitado está em tabela[i][j].

Use a contagem padrão, iniciada em zero, para que esses números sejam os índices reais da tabela.

Posição e valor juntos

python
tabela = [[4, 6], [7, 2]]

for i, linha in enumerate(tabela):
    for j, valor in enumerate(linha):
        print(i, j, valor)

# Saída:
# 0 0 4
# 0 1 6
# 1 0 7
# 1 1 2
Tabela com valores 4 e 6 na linha de índice 0, e 7 e 2 na linha de índice 1. O valor 7 está destacado na linha 1, coluna 0: tabela[1][0].

O par de índices (1, 0) localiza o valor 7: primeiro a linha, depois a coluna.

Complete o laço interno

Preencha a lacuna com uma chamada de enumerate para obter o índice da coluna e seu valor:

tabela = [[4, 6], [7, 2]]

for i, linha in enumerate(tabela):
    for j, valor in ____:
        print(i, j, valor)

Atualize usando as coordenadas

No seu editor, execute o código abaixo com Python 3. Ele procura o valor 5 e usa os índices encontrados para trocar somente essa célula por 9. Compare a tabela antes e depois e observe as coordenadas impressas.

Prática no seu computador

python
tabela = [[3, 8], [5, 1]]

print("Antes:", tabela)

for i, linha in enumerate(tabela):
    for j, valor in enumerate(linha):
        if valor == 5:
            print(f"Alterando: linha {i}, coluna {j}")
            tabela[i][j] = 9

print("Depois:", tabela)

Dica

Mude a célula, não a estrutura

A atribuição tabela[i][j] = 9 substitui apenas o valor nessa posição. Neste percurso, mantenha o tamanho da tabela e de cada linha: não adicione nem remova elementos.

Confira o resultado

Quais coordenadas o programa imprimiu? Escreva o caminho de acesso à célula alterada e a tabela final. Que comparação entre antes e depois confirma que somente a célula desejada mudou?

Escreva pelo menos 20 caracteres (0/20).

Passo 6 de 7

Extrair valores para uma nova lista

Extraia campos de registros e reúna valores de coleções em dois níveis, preservando a ordem e as repetições.

Um campo de cada registro

Para extrair apenas os nomes de uma lista de registros, percorra os dicionários e acrescente o campo desejado à lista de resultados.

Crie a lista vazia antes do laço: ela precisa acumular os nomes, não recomeçar a cada registro.

Extrair sem alterar os registros

Cada passagem acrescenta um nome, na ordem dos registros. Nomes repetidos continuam no resultado.

python
registros = [
    {"nome": "Ana", "pontos": 8},
    {"nome": "Bia", "pontos": 6},
    {"nome": "Ana", "pontos": 9}
]

nomes = []
for registro in registros:
    nomes.append(registro["nome"])

print(nomes)
# Saída: ['Ana', 'Bia', 'Ana']

Trocar o campo extraído

Extrair os pontos

Usando os mesmos registros da tela anterior, complete a lacuna para obter [8, 6, 9]:

pontos = []
for registro in registros:
    pontos.append(___)

print(pontos)

Reunir valores de dois níveis

Achatar: retirar um nível de agrupamento

Para transformar uma lista de listas em uma lista plana, use append no laço interno, acrescentando cada valor. A lista de resultados fica antes dos dois laços.

Se a origem for um dicionário de listas, o laço externo pode usar values(). As listas são visitadas na ordem de inserção das chaves; dentro delas, os valores seguem sua ordem original.

Duas listas internas, [2, 4] e [4, 1], enviam seus valores, nessa ordem, para uma única lista: [2, 4, 4, 1]. Os dois valores 4 são preservados.

Achatar preserva a ordem do percurso e as repetições; não soma nem elimina valores.

De listas internas para valores individuais

python
linhas = [[2, 4], [4, 1]]

valores = []
for linha in linhas:
    for valor in linha:
        valores.append(valor)

print(valores)
# Saída: [2, 4, 4, 1]

A mesma ideia com um dicionário

values() fornece cada lista ao laço externo.

python
materiais = {
    "escrita": ["lápis", "caneta"],
    "desenho": ["lápis", "régua"]
}

todos = []
for lista in materiais.values():
    for material in lista:
        todos.append(material)

print(todos)
# Saída: ['lápis', 'caneta', 'lápis', 'régua']

Valor ou lista inteira?

Uma extração que ainda mantém sublistas

O objetivo é obter uma lista plana, mas o código abaixo ainda não faz isso.

python
linhas = [[3, 5], [3]]

resultado = []
for linha in linhas:
    resultado.append(linha)

print(resultado)

Complete o achatamento

Qual é a saída do código original? Reescreva o trecho desde resultado = [] para acrescentar cada número usando um laço interno e informe a nova saída. Se quiser conferir, execute as duas versões no seu Python.

Escreva pelo menos 25 caracteres (0/25).

Passo 7 de 7

Aplicar e revisar o percurso completo

Integre consulta, atualização, localização por coordenadas e extração em uma tarefa no seu computador.

Desafio: conferir quantidades e reunir materiais

Do caminho ao resultado

No seu editor, copie o código-base abaixo e substitua os comentários TODO pelas instruções necessárias. Execute com Python 3 no seu computador.

  1. Consulte e imprima o valor da linha de índice 1, coluna de índice 0.
  2. Atualize somente essa célula para 9 e imprima a tabela inteira para comparar.
  3. Percorra a tabela com dois laços e enumerate. Imprima os índices da linha e da coluna onde estiver o valor 9.
  4. Percorra as listas de categorias com values() e reúna cada material em materiais usando append. Preserve a ordem e as repetições.

Antes de escrever cada acesso, identifique a coleção obtida no primeiro nível e o valor alcançado no segundo.

A tabela antes da alteração

Tabela com colunas de índices 0 e 1. A linha de índice 0 contém 4 e 7; a linha de índice 1 contém 2 e 5. A célula de valor 2 está destacada na linha 1, coluna 0.

O primeiro índice seleciona a linha; o segundo seleciona a célula dentro dela.

Código-base

As estruturas iniciais estão completas. Acrescente seu código nos pontos indicados.

python
quantidades = [
    [4, 7],
    [2, 5]
]

categorias = {
    "escrita": ["lápis", "caneta"],
    "desenho": ["lápis", "régua"]
}

print("Antes:", quantidades)

# TODO: consultar e imprimir a célula da linha 1, coluna 0.

# TODO: atualizar somente essa célula para 9.
print("Depois:", quantidades)

# TODO: usar dois laços com enumerate para localizar 9.
# Ao encontrá-lo, imprimir o índice da linha e o da coluna.

materiais = []
# TODO: percorrer categorias.values() e cada lista interna.
# Acrescentar cada material à lista materiais.
print("Materiais:", materiais)

Registre sua verificação

O que seu programa mostrou?

Após executar seu código, relate o valor consultado, a tabela após a alteração, as coordenadas do 9 e a lista plana de materiais. Indique também quais dados permaneceram intactos.

Escreva pelo menos 40 caracteres (0/40).

Confira a solução completa

Dois níveis, uma ação por vez

quantidades[1] alcança uma lista; quantidades[1][0] alcança o número que será alterado. Na extração, cada valor de categorias é uma lista: o laço interno alcança os materiais que entram no resultado.

Solução comentada

Se o resultado foi diferente, execute esta versão e compare os caminhos e a indentação com os seus.

python
quantidades = [
    [4, 7],
    [2, 5]
]

categorias = {
    "escrita": ["lápis", "caneta"],
    "desenho": ["lápis", "régua"]
}

print("Antes:", quantidades)

# O caminho completo chega à célula, não apenas à linha.
print("Valor consultado:", quantidades[1][0])
quantidades[1][0] = 9
print("Depois:", quantidades)

# Os índices começam em zero e correspondem às posições reais.
for i, linha in enumerate(quantidades):
    for j, quantidade in enumerate(linha):
        if quantidade == 9:
            print("Coordenadas:", i, j)

# A lista de resultados é criada antes dos dois laços.
materiais = []
for lista in categorias.values():
    for material in lista:
        materiais.append(material)

print("Materiais:", materiais)

Exemplo

Saída esperada

Antes: [[4, 7], [2, 5]]
Valor consultado: 2
Depois: [[4, 7], [9, 5]]
Coordenadas: 1 0
Materiais: ['lápis', 'caneta', 'lápis', 'régua']

Somente o 2 foi substituído por 9. A extração seguiu a ordem das categorias e dos materiais dentro de cada lista, mantendo a repetição de 'lápis'.

Revisão final

Resumo

Lista de verificação

Use este roteiro ao consultar e atualizar coleções aninhadas:

  • Reconheça a estrutura: lista de listas, lista de dicionários ou dicionário de listas.
  • Monte o caminho da esquerda para a direita: índice ou chave em cada nível, conferindo se a posição ou chave existe.
  • Na atribuição, alcance o valor interno; parar um nível antes substitui a coleção que o contém.
  • Nos laços aninhados, percorra toda a coleção interna atual antes de passar à próxima; use enumerate quando precisar das posições.
  • Para extrair valores, crie a lista de resultados antes do percurso e use append no nível do valor desejado.
  • Confira o antes e o depois, os dados preservados, as coordenadas, a ordem e as repetições.

Tutorial concluído

Parabéns! Você concluiu: Consultar e atualizar coleções aninhadas

Você praticou como alcançar e atualizar um valor interno, percorrer dois níveis e reunir valores em uma nova lista — sem substituir indevidamente as coleções que os contêm.

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso