
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.
Trilha de aprendizado · Nível 3 · Tutorial 8
Representar dados em mais de um nível e localizar, modificar ou extrair informações de combinações de listas e dicionários.
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
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
Atualizar somente o valor desejado
Use o caminho completo na atribuição e confira se apenas o valor interno foi alterado. 3 min
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
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
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
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

Passo 1 de 7
Organize tabelas, registros e grupos usando listas e dicionários dentro de outras coleções.
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.
Em cada linha, a primeira coluna representa cadernos e a segunda, canetas. Os colchetes mais externos envolvem a tabela inteira.
quantidades = [
[3, 1],
[4, 2]
]
Uma lista externa, duas listas internas e dois valores em cada linha.
Complete a lacuna com um literal de lista contendo 4 e 2, nessa ordem.
quantidades = [
[3, 1],
___
]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.
Os colchetes externos reúnem os registros. Cada par de chaves { } delimita um dicionário com os campos de um produto.
produtos = [
{"nome": "caderno", "quantidade": 3},
{"nome": "caneta", "quantidade": 1}
]As chaves externas { } delimitam o dicionário. Cada chave de categoria está associada a uma lista delimitada por colchetes.
materiais = {
"papelaria": ["caderno", "caneta"],
"limpeza": ["sabão", "esponja"]
}Associe cada necessidade à forma de aninhamento mais adequada.
Toque em um item e depois no par correspondente.

Passo 2 de 7
Combine índices e chaves para consultar valores internos, conferindo o tipo e os limites de cada nível.
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.
Observe nos comentários o resultado de cada acesso intermediário.
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![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.](https://cursa-json-routes.s3.amazonaws.com/learning-paths/pt/python/b730454e0225/level-03/tutorial-08/step-02/screen-01/item-03.webp)
Cada seta representa um par de colchetes. O segundo acesso atua sobre o resultado do primeiro.
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.
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.
Aqui, a chave existe, mas sua lista não tem a posição 1.
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.
Com tabela = [[4, 7], [2, 9]], complete para obter 9:
tabela[1][___]
Com pessoas = [{"nome": "Bia"}, {"nome": "Caio"}], complete para obter "Caio". Digite apenas o texto entre as aspas:
pessoas[1]["___"]
Com grupos = {"arte": ["papel", "tinta"]}, complete para obter "papel":
grupos["arte"][___]

Passo 3 de 7
Use o caminho completo na atribuição e confira se apenas o valor interno foi alterado.
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.
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]]
A linha de índice 1 continua sendo uma lista: apenas sua posição de índice 1 passa de 5 para 9.
Considere tabela = [[4, 7], [2, 5]]. Qual atribuição troca apenas o número 2 por 8?
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.
Este exemplo está completo e pode ser executado no seu Python. Os comandos print permitem comparar cada estrutura antes e depois.
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
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.
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
Use um laço para selecionar cada linha e outro para visitar seus valores, acompanhando a ordem de execução.
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.
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
Primeiro são visitados todos os valores de [4, 7]; depois, os de [2, 9].
Agora considere tabela = [[6, 1], [8, 3]]. Usando os mesmos dois laços do exemplo anterior, em que ordem os valores serão impressos?
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.
Se quiser conferir, execute este código no seu Python.
tabela = [[6, 8], [3], [5, 1]]
for linha in tabela:
for valor in linha:
print(valor)
print("Fim da linha")Exemplo
| 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.
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
Use enumerate nos dois laços para obter coordenadas e atualizar uma célula sem alterar as demais.
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.
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].](https://cursa-json-routes.s3.amazonaws.com/learning-paths/pt/python/b730454e0225/level-03/tutorial-08/step-05/screen-01/item-03.webp)
O par de índices (1, 0) localiza o valor 7: primeiro a linha, depois a coluna.
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)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.
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
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.
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
Extraia campos de registros e reúna valores de coleções em dois níveis, preservando a ordem e as repetições.
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.
Cada passagem acrescenta um nome, na ordem dos registros. Nomes repetidos continuam no resultado.
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']Usando os mesmos registros da tela anterior, complete a lacuna para obter [8, 6, 9]:
pontos = []
for registro in registros:
pontos.append(___)
print(pontos)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.](https://cursa-json-routes.s3.amazonaws.com/learning-paths/pt/python/b730454e0225/level-03/tutorial-08/step-06/screen-03/item-02.webp)
Achatar preserva a ordem do percurso e as repetições; não soma nem elimina valores.
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]values() fornece cada lista ao laço externo.
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']O objetivo é obter uma lista plana, mas o código abaixo ainda não faz isso.
linhas = [[3, 5], [3]]
resultado = []
for linha in linhas:
resultado.append(linha)
print(resultado)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
Integre consulta, atualização, localização por coordenadas e extração em uma tarefa no seu computador.
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.
Antes de escrever cada acesso, identifique a coleção obtida no primeiro nível e o valor alcançado no segundo.

O primeiro índice seleciona a linha; o segundo seleciona a célula dentro dela.
As estruturas iniciais estão completas. Acrescente seu código nos pontos indicados.
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)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).
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.
Se o resultado foi diferente, execute esta versão e compare os caminhos e a indentação com os seus.
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
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'.
Resumo
Use este roteiro ao consultar e atualizar coleções aninhadas:
Parabéns! Você concluiu: Consultar e atualizar coleções aninhadas
Milhares de cursos online em vídeo, ebooks e áudiobooks.
Para testar seus conhecimentos no decorrer dos cursos online
Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail
Baixe nosso aplicativo pelo QR Code ou pelos links abaixo:.
+ de 10 milhões
de alunos
Certificado grátis e
válido em todo o Brasil
60 mil exercícios
gratuitos
4,8/5 classificação
nas lojas de apps
Cursos gratuitos em
vídeo, ebooks e audiobooks