Solução: Uma solução possível, a mais natural, seria:
1.
for
i
in
range(
20
,
-
1
,
-
2
):
2.
print
"i= "
,i
Notar como tudo se resolve usando range com três argumentos. Note-se que os valores têm que ser impressos por ordem decrescente, incluindo o zero. Como o último argumento não conta temos que deixar ir até -1.
Pergunta 3
Enunciado: Suponha que participa numa competição em que lhe são atribuídos pontos (um número inteiro) por cada jogo que faz. Admita também que a sua pon- tuação final é a média dos pontos que obteve nos jogos, depois de serem retirados o seu melhor e o pior resultados. Escreva um programa que dados os resultados dos vários jogos, devolve a sua pontuação.
Solução: Sabemos que as pontuaçõeds estão guardadas numa lista e que temos que primeiro retirar o valor menor e o valor maior. Podemos para tal, usar as funções max e min. Mas vamos fazer de outro modo, começando por ordenar a lista. Depois disso, basta fazer uma cópia sem o primeiro (o mais pequeno) e o último (o maior) elementos. O cálculo da média depois é trivial, havendo apenas o cuidado de garantir que a divisão envolve floats. Atente-se ainda o modo como podemos somar os elementos de uma lista com a função sum.
1.
def
pontos(valores):
2.
valores.sort()
3.
contam
=
valores[
1
:
-
1
]
4.
res
=
sum(contam)
/
float(len(contam))
5.
return
res
Pergunta 4
Enunciado: Suponha um ficheiro formado por várias linhas e em que cada linha contém um certo número de números. A quantidade de números por linha não é necessariamente a mesma. Um exemplo de ficheiro possível ( mas é apenas um exemplo!):
12 15 30 26
100 34 13
34
58 39 9 22
Pretendemos um programa que dado um ficheiro com estas caracterís- ticas, determina o valor mais alto em cada linha, e calcula a média desses valores. Se olharmos para o exemplo acima o resultado devia ser calculado a como (30 + 100 + 34 + 58)/4, ou seja, 55.5.
Solução: Uma vez mais procuraremos uma solução simples. Precisamos de ler e guardar os dados. Fazemos isso, construindo uma lista de cadeias de caracteres (readlines()). Mas o que queremos é manipular números. por isso, a seguir, obtemos os dados na forma de lista de listas, em que cada elemento é uma listqa com os números de uma dada linha. Para isso, recorremos a listas por compreensão, embora também possa ser feito de modo mais convencional com um ciclo for. Vamos depois identificar os maiores valores em cada linha, recorrendo à função max e a listas por compreensão. Obtido estes valores o cálculo da média é trivial.
01.
def
media(ficheiro):
02.
# ler dados
03.
f_in
=
open(ficheiro,
'r'
)
04.
dados
=
f_in.readlines()
05.
f_in.close()
06.
# passa a lista de lista de números
07.
for
i
in
range(len(dados)):
08.
dados[i]
=
[float(elem)
for
elem
in
dados[i][:
-
1
].split()]
09.
# identifica os máximos
10.
maximos
=
[max(elem)
for
elem
in
dados]
11.
# calcula média
12.
media
=
sum(maximos)
/
float(len(maximos))
13.
return
media
Pergunta 5
Enunciado: Uma matriz de inteiros pode ser representada em Python por uma lista de listas. Assim, por exemplo, a matriz:
5 0 0
9 0 8
0 0 33
pode ser representada por:
[[5,0,0], [9,0,8],[0,0,33]]
Quando uma matriz tem muitos valores iguais a zero, uma forma mais conveniente de representar essa matriz usando apenas os valores não nulos. Uma forma de fazer isso em Python é através de um dicionário, em que cada elemento da matriz aij = k, k ̸= 0 é representada pelo par (chave:valor) ( (i, j):k). No caso anterior teríamos:
{ (1,1):5, (2,1):9, (2,3): 8, (3,3):33}
Escreva um programa que dada uma matriz representada por uma lista de listas, devolva a matriz equivalente representada por um dicionário.
Solução: Precisamos converter os dados da matriz, inicialmente organizados como uma lista de listas, para um dicionário, onde apenas colocamos os elementos diferentes de zero. A ideia da solução mais abaixo é percorrer a matriz elemento a elemento e testar se o valor é diferente de zero. Se for guardamos no dicionário.
1.
def
esparsa(matriz):
2.
res
=
{}
3.
for
linha
in
range(len(matriz)):
4.
for
coluna
in
range(len(matriz[
0
])):
5.
if
matriz[linha][coluna] !
=
0
:
6.
res[(linha
+
1
,coluna
+
1
)]
=
matriz[linha][coluna]
7.
return
res