2012-10-05 180 views
15

因此,我正在使用一些预先存在的比较器来比较两个元组中的某些值,如果第一个大于第二个则返回true,否则返回false。下面是其中的一个代码:使用比较函数进行排序

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 

现在,我有了上述比较的类型众多的元组项目的字典。我想按相反的顺序对它们进行排序,但我并不真正了解如何实现这一目标。我的想法是这样的:

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

但我不知道该怎么进入比较,因为每个比较器有两个参数(subInfo1,subInfo2)。 我无法更改比较器功能。

+3

比较功能在Python中不推荐使用;改用键功能。 –

+0

'if condition:return True else:return False' should''return condition'。 –

+1

词典不保存顺序。如果你想要一个已排序的字典,你应该使用集合模块中的OrderedDict。 – Matt

回答

21

您正在通过比较器作为key函数。你应该把它作为cmp传递给它,它包含了某种函数,将它变成一个适当的比较器。

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) 

(尽管实际上,你应该使用主要功能:

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

还要注意的是sortedDict不会真正成为一个dict,所以这个名字是相当混乱。)

+6

此外,比较器不应该返回“真”或“假”,而是-1,0或1. – kindall

+0

@kindall:哎呀,错过了。 –

+4

比较器的包装器功能不错。你也可以提到'functools.cmp_to_key'。 – kindall

相关问题