2012-10-05 16 views
15

Estoy trabajando con algunos comparadores preexistentes que comparan ciertos valores en dos tuplas y devuelven verdadero si el primero es mayor que el segundo, falso si no es así. Aquí está el código para uno de ellos:Usando una función de comparación para ordenar

def cmpValue(subInfo1, subInfo2): 
    """ 
    Returns True if value in (value, work) tuple subInfo1 is GREATER than 
    value in (value, work) tuple in subInfo2 
    """ 
    # TODO... 
    if subInfo1[0] > subInfo2[0]: 
     return True 
    else: 
     return False 

Ahora, tengo un diccionario que tiene numerosas entradas de tuplas del tipo que se comparan anteriormente. Quiero ordenarlos todos en orden inverso, pero realmente no entiendo cómo lo lograría. Estaba pensando en algo como:

sortedDict = sorted(subjects, key=comparator, reverse = True) 

Pero no sé qué pasa en el comparador, porque cada comparador toma dos argumentos (subInfo1, subInfo2). No puedo cambiar las funciones del comparador.

+3

funciones de comparación son desaprobado en Python; use funciones clave en su lugar. –

+0

'if condición: return True else: return False' debe ser' return condition'. –

+1

Los diccionarios no conservan el orden. Si desea un diccionario ordenado, debe usar 'OrderedDict' del módulo de colecciones. – Matt

Respuesta

21

Está pasando el comparador como la función key. Debería pasarlo como cmp, envuelto en algún tipo de función que lo convierta en un comparador adecuado.

def make_comparator(less_than): 
    def compare(x, y): 
     if less_than(x, y): 
      return -1 
     elif less_than(y, x): 
      return 1 
     else: 
      return 0 
    return compare 

sortedDict = sorted(subjects, cmp=make_comparator(cmpValue), reverse=True) 

(Aunque en realidad, usted debe utilizar las funciones clave:

sorted(subjects, operator.itemgetter(0), reverse=True) 

También tenga en cuenta que sortedDict no será en realidad un dict, por lo que el nombre es bastante confusa.)

+6

Además, el comparador no debe devolver 'Verdadero' o 'Falso', sino -1, 0 o 1. – kindall

+0

@kindall: ¡Uy, se perdió eso! –

+4

Buen trabajo en la función de envoltura para el comparador. También podría mencionar 'functools.cmp_to_key' también. – kindall

Cuestiones relacionadas