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.
1.def filhos(ag,nome):
2.    fil = []
3.    for ch,val in ag.items():
4.        if nome in val:
5.            fil.append(ch)
6.    return fil
Resolvido esta questão vamos então usar a definição de netos: os filhos dos filhos.
1.def netos(ag,nome):
2.    = filhos(ag,nome)
3.    net = []
4.    for filho in f:
5.        net.extend(filhos(ag,filho))
6.    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:
01.def define_notas(fich_1,fich_2):
02.    with open(fich_1,'r',encoding='utf-8') as f_ent:
03.        with open(fich_2,'w',encoding='utf-8') as f_saida:
04.            for linha in f_ent:
05.                # transforma linha
06.                #  —- retira pior nota
07.                nome,apelido,*notas = linha.strip().split()
08.                notas = list(notas)
09.                notas.remove(min(notas))
10.                #  —- escreve nova linha
11.                nova_linha = nome + ' ' + apelido + ' ' + ' '.join(notas) + '\n'
12.                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:
1.nome,apelido,n1,n2,n3 = linha.strip().split()
2.           notas = [n1,n2,n3]

Sem comentários:

Enviar um comentário