sábado, 7 de novembro de 2009

Problema 5.27

Ordenar uma pauta pelo valor e não pela chave já é mais complexo. Uma solução possível é a seguinte.


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.

2 comentários:

  1. Boa noite professor,

    Existe 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

    ResponderEliminar
  2. 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:

    def 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 :-)!

    ResponderEliminar