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
1.
def
netos(ag,nome):
2.
f
=
filhos(ag,nome)
3.
net
=
[]
4.
for
filho
in
f:
5.
net.extend(filhos(ag,filho))
6.
return
net
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)
1.
nome,apelido,n1,n2,n3
=
linha.strip().split()
2.
notas
=
[n1,n2,n3]
Sem comentários:
Enviar um comentário