musicas = {'pink floyd': [{'nome':'dark side', ‘tipo':'pop','emprestado':False},{'nome':'wall','tipo':'pop','emprestado':True}],
'doors': [{'nome':'LA woman’,'tipo':'rock','emprestado':True},{'nome':'live','tipo':'rock','emprestado':False}],
'jethro tull':[{'nome':'thick as a brick','tipo': ‘rock','emprestado':False}]}
Esta organização não pretende ser realista, mas apenas uma ajuda a compreender as operações sobre dicionários. Coloquei três questões para esta representação: (1) adicionar um album à base de dados de músicas; (2) Marcar um album como emprestado; (3) listar todas as músicas de um dado tipo. Vamos resolver por etapas.No primeiro caso uma solução trivial será:
def acrescentar(dicio_musicas,autor,album):
dicio_musicas[autor] = dicio_musicas.get(autor,[]) + [album]
Como se pode ver uma simples instrução resolve o assunto. Notar que os dicionários são objectos mutáveis nos valores pelo que as alterações efectuadas são permanentes e não é obrigatório usar o return para devolver a nova versão do dicionário. Refira-se ainda neste caso apenas o método get ou o setdefault eram apropriados, garantindo que não há interrupção por erro caso o autor ainda não exista no dicionário.Para o segundo caso apresentamos duas soluções:
def emprestar(dicio_musicas,autor,album):
albuns = dicio_musicas.get(autor,[])
if albuns:
for musica in albuns:
if musica == album:
musica['emprestado'] = True
break
def emprestar_b(dicio_musicas,autor,nome_musica):
albuns = dicio_musicas.get(autor,[])
if albuns:
for musica in albuns:
if musica['nome'] == nome_musica:
musica['emprestado'] = True
break
Nos dois casos verificamos se o autor existe e, depois, se o album existe. Passados estes dois testes fazemos a alteração. A primeira solução pressupõe que todo o album é fornecido como entrada, enquanto que no segundo caso apenas o nome do album é fornecido. Notar uma vez mais o não recurso a return.Finalmente, para o terceiro problema:
def musicas_tipo(dicio_musicas, tipo):
res = []
for albuns_autor in dicio_musicas.values():
# analisa musicas de um autor
for album in albuns_autor:
if album['tipo'] == tipo:
res.append(album['nome'])
return res
Agora, executarmos um ciclo, por autor, em que os álbuns dos autores são analisados à vez.

Sem comentários:
Enviar um comentário