2013-04-10 80 views
1

我正在研究一些元组的python字典。每个元组包含2个整数。元组中的第一个数字被认为是value,第二个数字被认为是work。我有3个不同的比较器,我需要按照降序对字典进行排序。这个顺序应该由调用哪个比较器决定。即字典可以按3种不同的方式分类。我尝试了尽可能多的不同方式,因为我可以找到这个工作。我可以在不使用比较器的情况下做到这一点,只需将其分解成列表并通过切分元组来排序即可,但如果任何人都可以通过比较器对语法进行排序,那么将不胜感激。我似乎正在为cmpWork正确地返回,但其他两个不会颠倒过来。
如果我能得到按元组值排序的字典,它也会很好。 我有一种与使用自定义比较器对元组的字典进行排序

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

工作,但这并不让我切片的元组。
第一次发布诺布如此道歉的任何错误。

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进行排序。

+0

提示:'sorted'返回一个新列表;无需创建'tmpSubjects'。你可以直接返回'sorted'的结果 – 2013-04-10 13:53:31

回答

1

但是,这并不让我切片的元组

与您的示例开始:

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

谢谢大家。我不知道我必须导入集合才能使用odereddict,所以非常感谢,并且我将cmp关键字从我的排序语句中删除。当我阅读Ricardos的答案时才发现它。当我添加它在它正常工作。感谢火山和里卡多。会让你知道我如何继续。 – Loubot 2013-04-10 14:05:58

0

如果需要排序的字典 - 使用collections.OrderedDict 例如,通过排序元组的第一个元素

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))]) 
+0

再次感谢你们。得到它的工作。 – Loubot 2013-04-10 15:33:04

相关问题