domingo, 20 de dezembro de 2015

Teste #3 - TP1

Pergunta 2
Temos uma árvore genealógica representada por um dicionário, sendo que as chaves são nomes de pessoas e os valores são os pais dessas pessoas. Trata-se pois de uma representação diferente (inversa) da discutida em post anterior. Pedem-nos um programa em que dado o dicionário e o nome de uma pessoa nos seja devolvido a lista dos netos dessa pessoa. É-nos sugerido que pensemos que os netos são os filhos dos filhos…
Com esta observação uma abordagem lógica seria começar por determinar os filhos de uma pessoa. Como a representação liga uma pessoa (chave) aos seus pais (valor) temos que percorrer o dicionário recorrendo às chaves e ao conteúdo.
def filhos(ag,nome):
    fil = []
    for ch,val in ag.items():
        if nome in val:
            fil.append(ch)
    return fil
Resolvido esta questão vamos então usar a definição de netos: os filhos dos filhos.
def netos(ag,nome):
    f  = filhos(ag,nome)
    net = []
    for filho in f:
        net.extend(filhos(ag,filho))
    return net
A estratégia é linear: determinamos os filhos e, depois, para cada um dos filhos, os seus filhos. Como o que é devolvido pela função filhos é uma lista temos que recorrer ao uso de extend.
Pergunta 3
Partimos de um ficheiro em que cada linha era composta por “nome apelido nota1 nota2 nota3\n” . Queremos criar um novo ficheiro em que cada linha é semelhante à do ficheiro de origem. A diferença é que foi retirada a nota mais baixa. Com esta formulação o problema torna-se mais simples e a estratégia é básica: percorrer o ficheiro origem por linha (ciclo for), transformar a linha e guardá-la no novo ficheiro. Daí a solução:
def define_notas(fich_1,fich_2):
    with open(fich_1,'r',encoding='utf-8') as f_ent:
        with open(fich_2,'w',encoding='utf-8') as f_saida:
            for linha in f_ent:
                # transforma linha 
                #  —- retira pior nota
                nome,apelido,*notas = linha.strip().split()
                notas = list(notas)
                notas.remove(min(notas))
                #  —- escreve nova linha
                nova_linha = nome + ' ' + apelido + ' ' + ' '.join(notas) + '\n'
                f_saida.write(nova_linha)
O lado menos usual nesta solução está no recurso a *notas quando estamos a extrair as componentes da linha. Quem não estivesse familiarizado com essa notação poderia sempre fazer:
 nome,apelido,n1,n2,n3 = linha.strip().split()
            notas = [n1,n2,n3]

Sem comentários:

Enviar um comentário