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_freqComo 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.