Solução: Uma solução possível, a mais natural, seria:
for i in range(20,-1,-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.
def pontos(valores):
valores.sort()
contam = valores[1:-1]
res = sum(contam)/float(len(contam))
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.
def media(ficheiro):
# ler dados
f_in = open(ficheiro,'r')
dados = f_in.readlines()
f_in.close()
# passa a lista de lista de números
for i in range(len(dados)):
dados[i] = [float(elem) for elem in dados[i][:-1].split()]
# identifica os máximos
maximos = [max(elem) for elem in dados]
# calcula média
media = sum(maximos) / float(len(maximos))
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.
def esparsa(matriz):
res = {}
for linha in range(len(matriz)):
for coluna in range(len(matriz[0])):
if matriz[linha][coluna] != 0:
res[(linha+1,coluna+1)] = matriz[linha][coluna]
return res