Boa noite Alvaro, tudo bem com você?
Acho esse tipo de problema divertido e desafiador, ele está relacionado a estrutura de dados e algoritmos. Resumidamente, algoritmo é um processo sistemático para a resolução de um problema; Estrutura de dados é a forma que os dados são representados numa linguagem de programação, listas, árvores, etc.
Já quando estamos tratando uma base de dados esse tipo de problema não é tão comum, quando encontramos dados com essa forma há uma grande chance do problema estar na modelagem dos dados.
Caso você tenha interesse em conhecer/treinar mais esse tipo de algoritmo, o episódio do podcast Hipsters #186 Algoritmos e estrutura de dados, pode te ajudar. Aqui na plataforma tem o curso de
Estrutura de Dados: Computação na prática com Java, apesar do curso ser com java, vale a pena o estudo pela parte conceitual.
Existem diversos livros do assunto com valores variados, vou indicar três pra você:
- Estruturas de Dados e seus Algoritmos - Markenzon
- Entendendo Algoritmos: Um Guia Ilustrado Para Programadores e Outros Curiosos - Aditya Y. Bhargava; e
- Algoritmos Teoria e Prática - Thomas H. Cormen;
Agora chega de papo e vamos aos códigos!
Lista utilizada para os exempos:
#vamos trabalhar em cima dessa lista
carro = [
'Jetta Variant',
'Motor 4.0 Turbo',
2003,
44410.0,
False,
['Rodas de liga', 'Travas elétricas', 'Piloto automático',['Rodas de liga']],
88078.64,
'Rodas de liga'
]
Função que recebe uma lista como parâmetro e imprime em qual nível a informação está localizada:
# imprime:
#- nível 1 para lista principal
#- nível 2 para sub lista
#- nível 3 para sub sub lista...
def imprime_estrutura_com_nivel(lista, nivel=0):
if nivel == 0:
nivel = 1
for i in lista:
if type(i) is list:
imprime_estrutura_com_nivel(i, nivel + 1)
else:
print(f"nível: {nivel} - {i}")
#chamada da função
imprime_estrutura_com_nivel(carro)
Saída:
nível: 1 - Jetta Variant
nível: 1 - Motor 4.0 Turbo
nível: 1 - 2003
nível: 1 - 44410.0
nível: 1 - False
nível: 2 - Rodas de liga
nível: 2 - Travas elétricas
nível: 2 - Piloto automático
nível: 3 - Rodas de liga
nível: 1 - 88078.64
nível: 1 - Rodas de liga
Função que conta o número de listas existentes:
#Mesma ideia de contar nós em árvores
def conta_numero_sublistas(lista):
if type(lista) != list:
return 0
conta = 1
for i in lista:
conta += conta_numero_sublistas(i)
return conta
conta_numero_sublistas(carro)
Saída:
3
Função que recebe um valor e imprime a informação com o nível situado:
#conta as ocorrências do valor
def imprime_valor_encontrado(lista,valor, nivel=0):
if nivel == 0:
nivel = 1
for i in lista:
if type(i) is list:
imprime_valor_encontrado(i,valor, nivel + 1)
elif str(i).find(valor) != -1:
print(f"o valor procurado está no nível: {nivel} - {i}")
#Chamada da função
imprime_valor_encontrado(carro,'Rodas de liga')
Saída:
o valor procurado está no nível: 2 - Rodas de liga
o valor procurado está no nível: 3 - Rodas de liga
o valor procurado está no nível: 1 - Rodas de liga
Abraço e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!