2010-10-20 50 views
8

我有建于以下方式一个奇怪的清单复杂列表:蟒蛇:如何排序在两个不同的密钥

[[name_d, 5], [name_e, 10], [name_a, 5]] 

,我想通过数(递减),如果先对它进行排序的话,数字是相同的,按名称(asc)。所以我想有结果是:

[[name_e, 10], [name_a, 5], [name_d, 5]] 

我试着认为我可以在排序方法使用lambda函数,但我不知道我能做到这一点。

+1

[嵌套元组列表的高级排序标准]的可能重复(http://stackoverflow.com/questions/3831449/advanced-sorting-criteria-for-a-list-of-nested-tuples) – SilentGhost 2010-10-20 16:08:51

回答

20

排序功能允许通过一个函数作为排序关键字:

l = [[name_d, 5], [name_e, 10], [name_a, 5]] 
# copy 
l_sorted = sorted(l, key=lambda x: (x[1] * -1, x[0])) 
# in place 
l.sort(key=lambda x: (x[1] * -1, x[0]) 

编辑: 1.排序顺序2.证明副本和到位排序

+0

他需要降序排序的号码 – SilentGhost 2010-10-20 16:07:00

+0

这不符合我想要的方式,因为它也排序在desc(或asc)模式下的名称 – 2010-10-20 16:09:20

+2

@Giovanni:它不是一个黑匣子。你看到它是如何解决的?你不能修改它以适应你的问题? – SilentGhost 2010-10-20 16:10:26

-2

它不需要是传递给sort方法的lambda函数,因为它们是python中的第一类对象,所以实际上可以提供一个真正的函数。

L.sort(my_comparison_function) 

应该只是罚款在Python

+2

- 1比较函数在Python 3中消失,而另一个答案是未来证明。 – 2010-10-20 16:12:24

+0

我想过这个,但我怎么能写一个比较函数在两个不同的键上工作?基本上我需要一个f((x [0],x [1]),(y [0],y [1])) – 2010-10-20 16:14:05

+0

@Steven:你在说什么?这个答案可能没用,但不是你说的原因。 [阅读文档](http://docs.python.org/py3k/library/stdtypes.html#mutable-sequence-types) – SilentGhost 2010-10-20 16:14:54

0

       这里有一些我whipp编辑(解决相同类型的问题)。我只用我安装的最新版本的Python(OS X)进行了检查。低于进口部分是(clunkily命名)排序关键字:sortKeyWithTwoListOrderssortKeyWith2ndThen1stListValue


#Tested under Python 2.7.1 & Python 3.2.3: 

import random # Just to shuffle for demo purposes 

# Our two lists to sort 
firstCol=['abc','ghi','jkl','mno','bcd','hjk'] 
secondCol=[5,4,2,1] 

# Build 2 dimensional list [[firstCol,secondCol]...] 
myList = [] 
for firstInd in range(0, len(firstCol)): 
    for secondInd in range(0, len(secondCol)): 
    myList = myList + [[firstCol[firstInd],secondCol[secondInd]]] 

random.shuffle(myList) 

print ("myList (shuffled):") 
for i in range(0,len(myList)): 
    print (myList[i]) 

def sortKeyWithTwoListOrders(item): 
    return secondCol.index(item[1]), firstCol.index(item[0]) 

myList.sort(key=sortKeyWithTwoListOrders) 
print ("myList (sorted according to strict list order, second column then first column):") 
for i in range(0,len(myList)): 
    print (myList[i]) 

random.shuffle(myList) 

print ("myList (shuffled again):") 
for i in range(0,len(myList)): 
    print (myList[i]) 

def sortKeyWith2ndThen1stListValue(item): 
    return item[1], item[0] 

myList.sort(key=sortKeyWith2ndThen1stListValue) 
print ("myList (sorted according to *values*, second column then first column):") 
for i in range(0,len(myList)): 
    print (myList[i]) 

myList (shuffled): 
['ghi', 5] 
['abc', 2] 
['abc', 1] 
['abc', 4] 
['hjk', 5] 
['bcd', 4] 
['jkl', 5] 
['jkl', 2] 
['bcd', 1] 
['ghi', 1] 
['mno', 5] 
['ghi', 2] 
['hjk', 2] 
['jkl', 4] 
['mno', 4] 
['bcd', 2] 
['bcd', 5] 
['ghi', 4] 
['hjk', 4] 
['mno', 2] 
['abc', 5] 
['mno', 1] 
['hjk', 1] 
['jkl', 1] 
myList (sorted according to strict list order, second column then first column): 
['abc', 5] 
['ghi', 5] 
['jkl', 5] 
['mno', 5] 
['bcd', 5] 
['hjk', 5] 
['abc', 4] 
['ghi', 4] 
['jkl', 4] 
['mno', 4] 
['bcd', 4] 
['hjk', 4] 
['abc', 2] 
['ghi', 2] 
['jkl', 2] 
['mno', 2] 
['bcd', 2] 
['hjk', 2] 
['abc', 1] 
['ghi', 1] 
['jkl', 1] 
['mno', 1] 
['bcd', 1] 
['hjk', 1] 
myList (shuffled again): 
['hjk', 4] 
['ghi', 1] 
['abc', 5] 
['bcd', 5] 
['ghi', 4] 
['mno', 1] 
['jkl', 1] 
['abc', 1] 
['hjk', 1] 
['jkl', 2] 
['hjk', 5] 
['mno', 2] 
['jkl', 4] 
['ghi', 5] 
['bcd', 1] 
['bcd', 2] 
['jkl', 5] 
['abc', 2] 
['hjk', 2] 
['abc', 4] 
['mno', 4] 
['mno', 5] 
['bcd', 4] 
['ghi', 2] 
myList (sorted according to *values*, second column then first column): 
['abc', 1] 
['bcd', 1] 
['ghi', 1] 
['hjk', 1] 
['jkl', 1] 
['mno', 1] 
['abc', 2] 
['bcd', 2] 
['ghi', 2] 
['hjk', 2] 
['jkl', 2] 
['mno', 2] 
['abc', 4] 
['bcd', 4] 
['ghi', 4] 
['hjk', 4] 
['jkl', 4] 
['mno', 4] 
['abc', 5] 
['bcd', 5] 
['ghi', 5] 
['hjk', 5] 
['jkl', 5] 
['mno', 5] 
0

您可以两次排序列表以获得结果,只是反转订单:

import operator 

l = [[name_d, 5], [name_e, 10], [name_a, 5]] 

l.sort(operator.itemgetter(1)) 
l.sort(operator.itemgetter(0), reverse=True) 

然后您将按预期得到排序列表。