我有建于以下方式一个奇怪的清单复杂列表:蟒蛇:如何排序在两个不同的密钥
[[name_d, 5], [name_e, 10], [name_a, 5]]
,我想通过数(递减),如果先对它进行排序的话,数字是相同的,按名称(asc)。所以我想有结果是:
[[name_e, 10], [name_a, 5], [name_d, 5]]
我试着认为我可以在排序方法使用lambda函数,但我不知道我能做到这一点。
我有建于以下方式一个奇怪的清单复杂列表:蟒蛇:如何排序在两个不同的密钥
[[name_d, 5], [name_e, 10], [name_a, 5]]
,我想通过数(递减),如果先对它进行排序的话,数字是相同的,按名称(asc)。所以我想有结果是:
[[name_e, 10], [name_a, 5], [name_d, 5]]
我试着认为我可以在排序方法使用lambda函数,但我不知道我能做到这一点。
排序功能允许通过一个函数作为排序关键字:
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.证明副本和到位排序
他需要降序排序的号码 – SilentGhost 2010-10-20 16:07:00
这不符合我想要的方式,因为它也排序在desc(或asc)模式下的名称 – 2010-10-20 16:09:20
@Giovanni:它不是一个黑匣子。你看到它是如何解决的?你不能修改它以适应你的问题? – SilentGhost 2010-10-20 16:10:26
它不需要是传递给sort
方法的lambda函数,因为它们是python中的第一类对象,所以实际上可以提供一个真正的函数。
L.sort(my_comparison_function)
应该只是罚款在Python
- 1比较函数在Python 3中消失,而另一个答案是未来证明。 – 2010-10-20 16:12:24
我想过这个,但我怎么能写一个比较函数在两个不同的键上工作?基本上我需要一个f((x [0],x [1]),(y [0],y [1])) – 2010-10-20 16:14:05
@Steven:你在说什么?这个答案可能没用,但不是你说的原因。 [阅读文档](http://docs.python.org/py3k/library/stdtypes.html#mutable-sequence-types) – SilentGhost 2010-10-20 16:14:54
这里有一些我whipp编辑(解决相同类型的问题)。我只用我安装的最新版本的Python(OS X)进行了检查。低于进口部分是(clunkily命名)排序关键字:sortKeyWithTwoListOrders和sortKeyWith2ndThen1stListValue
#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]
您可以两次排序列表以获得结果,只是反转订单:
import operator
l = [[name_d, 5], [name_e, 10], [name_a, 5]]
l.sort(operator.itemgetter(1))
l.sort(operator.itemgetter(0), reverse=True)
然后您将按预期得到排序列表。
[嵌套元组列表的高级排序标准]的可能重复(http://stackoverflow.com/questions/3831449/advanced-sorting-criteria-for-a-list-of-nested-tuples) – SilentGhost 2010-10-20 16:08:51