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 filResolvido 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 netA 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