sábado, 24 de outubro de 2009

Problema 4.14

Os dicionários não têm ordem. No entanto, muitas vezes, interessa-nos ver ou apresentar os seus elementos por ordem. O caso mais complexo, é quando a ordem é pelos valores. Comecemos por mostrar a solução clássica.


import operator

def ordena_valor(d):
"""
Apresenta um dicionario ordenado pelo valor. Retorna o resultado sob a
forma de lista
"""
items = d.items()
ordenado =sorted(items,key=operator.itemgetter(1))
return ordenado



Como se pode ver, embora o código seja pequeno, aparecem muitas coisas novas. Desde logo, o módulo operator, essencial para resolver a questão. Esse módulo permite-nos usar o método itemgetter que vai a uma estrutura buscar um dos seus componentes. Como sabemos que os items de um dicionário são tuplos com duas componentes (a chave e o valor), temos que extrair a sua segunda componente (posição 1). Na linha está o essencial da solução. O método sorted, que actua sobre listas, recebe a lista dos pares (chave:valor) e como critério de ordenamento o segundo argumento do par (o valor) (key=operator.itemgetter(1)). E assim se vê como um problema complexo pode ser resolvido de modo rápido e claro ... quando se conhecem bem as operações facultadas pela linguagem e pelos seus módulos.

3 comentários:

  1. uma lição que aprendi:
    antes de pensar em complicar , ver o que a linguagem nos aferece

    ResponderEliminar
  2. Haha, pessoalmente mfico-me pelos basicos e chego la, o que e mau, assim nunca avanço --U Mas prontos...

    def orderbykey(dict):
    list=[]
    for a in dict.keys():
    b=(dict[a],a)
    list.append(b)
    list.sort()
    print list

    ResponderEliminar
  3. Quem não tem cão caça com gato... Assim é natural que no início do contyacto com uma linguagem de programação nova, as nossas soluções possam ser mais ... primitivas! Mas não é problemático! Bom é ser capaz de encontrar uma solução. O resto vem com o tempo e a prática!!

    Já agora. Uma solução alternativa, com mais umas coisitas novas.


    def ordena_chaves(item1,item2):
    --- """ Compara dois valores."""
    --- return cmp(item1[1],item2[1])

    def my_sort(dic):
    --- lista_items = dic.items()
    --- lista_items.sort(lambda x, y: ordena_chaves(x,y))
    --- return lista_items

    ResponderEliminar