terça-feira, 15 de dezembro de 2015

Das aulas

Na aula de hoje falei numa organização das nossas músicas recorrendo a um dicionário. O dicionário é formado por pares (autor, lista dos álbuns do autor). Por sua vez, cada album da lista é representado por um dicionário com três pares. O primeiro é o par (nome, nome da música), o segundo o par (tipo, tipo da música), e o terceiro o par (emprestado, sim/não). Um exemplo de dicionário (muito pequeno …).
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