import operator
def pauta_nota(dic):
""" Ordena a pauta pela nota."""
itens = dic.items()
pauta = sorted(itens,key=operator.itemgetter(1), reverse=True)
return pauta
Socorremo-nos do módulo operator, que nos disponibiliza um método para obter elementos particulares de uma estrutura. O programa começa por obter a lista dos tuplos, isto é, pares (chave:valor), armazenados no dicionário (linha 3). Sendo uma lista pode ser ordenada. Usamos depois (linha 4) a operação pré-definida do sistema, sorted com os vários campos instanciados. Como vamos quere as notas mais altas no inicio indicamos reverse=True. Com o método ittemgetter vamos buscar a segunda componente de cada para, ou seja a nota, e é este elemento que é usado nas comparações necessárias parta o ordenamento.
Boa noite professor,
ResponderEliminarExiste alguma maneira de resolver este problema sem recorrer ao módulo operator, ao comando zip, ou a funções lambda?
Eu estou a tentar resolver este problema de forma mais primitiva, com ciclos, operações específicas, e pouco mais, e não consigo resolver esta questão.
Se o professor me pudesse ajudar ficar-lhe-ia agradecido
Obrigado pela atenção,
Adriano Vinhas
Claro que pode fazer de outro modo. Lembra-se de na ficha 10 falarmos de ordenamento? Lembra-se da solução do problema 10.2 (está no blogue)? Neste problema pedia-se para ordenar de modo ascendente ou descendente. Para resolver a questão de modo elegante usámos um novo parâmetro para indicar o método. Podemos usar a mesma ideia aqui. Usamos um programa que diz o que queremos comparar dos objectos. Como vão ser tuplos e o que nos interessa é o segundo elemento a nova definição pode ser algo como:
ResponderEliminardef compara(x,y):
return x[1] > y[1]
Agora basta obter os elementos do dicionário e mandar ordenar com um dos métodos de ordenamento dados, que deve usar o programa de comparação referido:
def ordena_dic_valor(dic):
"""Ordena o conteúdo do dicionário pelos valores."""
elementos = dic.items()
return insertion_both(elementos,compara) # este é o 10.2
def insertion_both(seq, metodo):
""" Como um jogador de cartas"""
copia=seq[:]
for cont in range(1,len(seq)):
elem=copia[cont]
indice=cont - 1
while (metodo(elem,copia[indice])) and (indice >= 0):
copia[indice + 1] = copia[indice]
indice = indice - 1
copia[indice + 1] = elem
return copia
E já está!
>>> dicio = {'luis':14,'ana':18,'jorge':5,'isabel':7,'ernesto':20}
>>> print ordena_dic_valor(dicio)
[('ernesto', 20), ('ana', 18), ('luis', 14), ('isabel', 7), ('jorge', 5)]
O facto do Ernesto ter 20 foi mera sorte :-)!