Num dicionários a diferentes chaves podemos ter associado o mesmo valor. O problema de calcular qual o valor mais frequente pode ser resolvido de forma simples do seguinte modo:
def moda(dicio):
# inverte dicio
novo_dicio = {}
for c,v in dicio.items():
novo_dicio[v] = novo_dicio.get(v,[]) + [c]
# passa a lista ordenada
lista_items = list(novo_dicio.items())
mais_freq = (0,[])
for val,lst in lista_items:
if len(lst) > len(mais_freq[1]):
mais_freq = (val,lst)
# devolve o mais valor mais frequente
return mais_freq
Como os comentários indicam, a estratégia de solução passa por inverter o dicionário, converter para uma lista e depois calcular o elemento, i.e. o par (valor, lista das chaves com esse valor), mais frequente. Para os pythónicos apresentamos outra solução que recorre a funções anónimas:
def moda_b(dicio):
# inverte dicio
novo_dicio = {}
for c,v in dicio.items():
novo_dicio[v] = novo_dicio.get(v,[]) + [c]
# passa a lista ordenada
lista_items = list(novo_dicio.items())
lista_items.sort(key=lambda x: len(x[1]),reverse=True)
# devolve o mais valor mais frequente
return lista_items[0]
A função anónima (lambda) é usada para o ordenamento ser feito de acordo com o tamanho do elemento na posição 1.Problema 3
O problema envolvia um ficheiro em que cada linha é formado por um nome e números (>= 3). Pretende-se criar um novo ficheiro com o nome e a média dos números depois de retirar o menor e o maior.
Uma solução mágica:
def fich_media(fich_entrada,fich_saida):
# modificar linha a linha
# abre ficheiros
f_in = open(fich_entrada,'r',encoding='utf8')
f_out = open(fich_saida,'w',encoding='utf8')
# trata por linha
for linha in f_in:
# escolhe numeros
linha = linha.strip().split()
nome = linha[0]
numeros = [ int(num) for num in linha[1:]]
numeros.sort()
# calcula média
media = sum(numeros[1:-1])/(len(numeros)-2)
# escreve nova linha
f_out.write(nome + str(media) + '\n')
# fecha ficheiros
f_in.close()
f_out.close()
Dada a natureza do enunciado resolvemos natural tratar o problema linha a linha. Cada linha é partida e os seus números ordenados. Calculamos de seguida a média retirando o primeiro (o mais pequeno) e o último (o maior).

Ola, gostaria de saber sobre esse problema.
ResponderEliminarConstrua uma função que receba um ficheiro de texto como parâmetro e
devolva um dicionário com cada uma das palavras do texto associada à lista de
linhas em que ocorre no texto. Implemente instruções que testem a função.