用自定义比较器的元组值对元组的dict进行排序

时间:2013-04-10 13:43:36

标签: python sorting tuples

我正在研究元组的一些python dicts。每个元组包含2个整数。元组中的第一个数字被称为值,第二个数字被称为工作。我有3个不同的比较器,我需要按顺序对dicts进行排序。该顺序应根据调用哪个比较器来确定。即,dict可以按3种不同方式分类。我已经尝试了尽可能多的不同方法来实现这一点。我可以在不使用比较器的情况下将其分解为一个列表并通过切片元组进行排序,但是如果有人可以对语法进行分析以使用比较器进行排序,我将非常感激。我似乎正在为cmpWork正确地返回,但其他2个没有逆转   如果我可以通过元组值对dict进行排序,那也很棒。   我和

一起工作了
sortedSubjects = sorted(tmpSubjects.iteritems(), key = operator.itemgetter(1), reverse = True)  

但这不会让我对元组进行切分 第一次发帖noob为任何错误道歉。

def cmpValue(subInfo1, subInfo2):  
    return cmp(subInfo2[0] , subInfo1[0])

def cmpWork(subInfo1, subInfo2):  
    return cmp(subInfo1[1] , subInfo2[1])  

def cmpRatio(subInfo1, subInfo2):  
    return cmp((float(subInfo2[0]) / subInfo2[1]) , (float(subInfo1[0]) / subInfo1[1]))  

def greedyAdvisor(subjects, comparator):  
    tmpSubjects = subjects.copy()  
    sortedSubjects = sorted(tmpSubjects.values(), comparator, reverse = True)   
    print sortedSubjects  


smallCatalog = {'6.00': (16, 8),'1.00': (7, 7),'6.01': (5, 3),'15.01': (9, 6)}  
greedyAdvisor(smallCatalog, cmpRatio)  
greedyAdvisor(smallCatalog, cmpValue)  
greedyAdvisor(smallCatalog, cmpWork)  

[(7, 7), (9, 6), (5, 3), (16, 8)]  
[(5, 3), (7, 7), (9, 6), (16, 8)]  
[(16, 8), (7, 7), (9, 6), (5, 3)]  

PS
这条线

sortedSubjects = sorted(tmpSubjects.iteritems(), key = operator.itemgetter(1), reverse = True)

返回

[('6.00', (16, 8)), ('15.01', (9, 6)), ('1.00', (7, 7)), ('6.01', (5, 3))]  

这几乎就是我正在寻找的东西,除了我不能按元组中的第二个值排序,我也不能按cmpRatio排序。

2 个答案:

答案 0 :(得分:1)

  

但这不允许我切片元组

从您的示例开始:

sortedSubjects = sorted(tmpSubjects.iteritems(),
                        key=operator.itemgetter(1),
                        cmp=comparator,   # What about specifying the comparison?
                        reverse=True)

答案 1 :(得分:0)

如果您需要对字典进行排序 - 请使用collections.OrderedDict 例如,按元组的第1个元素排序

 OrderedDict(sorted(smallCatalog.items(), key=lambda e:e[1][0]))
Out[109]: OrderedDict([('6.01', (5, 3)), ('1.00', (7, 7)), ('15.01', (9, 6)), ('6.00', (16, 8))])