【发布时间】:2010-10-20 16:00:18
【问题描述】:
我有一个按以下方式构建的奇怪列表:
[[name_d, 5], [name_e, 10], [name_a, 5]]
我想先按数字(desc)对其进行排序,然后,如果数字相同,则按名称(asc)。所以我想要的结果是:
[[name_e, 10], [name_a, 5], [name_d, 5]]
我试着想出一个可以在 sort 方法中使用的 lambda 函数,但我不确定我能不能做到。
【问题讨论】:
我有一个按以下方式构建的奇怪列表:
[[name_d, 5], [name_e, 10], [name_a, 5]]
我想先按数字(desc)对其进行排序,然后,如果数字相同,则按名称(asc)。所以我想要的结果是:
[[name_e, 10], [name_a, 5], [name_d, 5]]
我试着想出一个可以在 sort 方法中使用的 lambda 函数,但我不确定我能不能做到。
【问题讨论】:
python 中的排序函数允许将函数作为排序键传递:
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. 演示复制和就地排序
【讨论】:
l.sort(key=lambda...)
您可以对列表进行两次排序以获得结果,只需颠倒顺序即可:
import operator
l = [[name_d, 5], [name_e, 10], [name_a, 5]]
l.sort(operator.itemgetter(1))
l.sort(operator.itemgetter(0), reverse=True)
然后你会得到预期的排序列表。
【讨论】:
这是我精心设计的(用于解决相同类型的问题)。我只用我安装的最新版本的 Python (OS X) 检查了它。下面的导入部分是(命名笨拙的)排序键: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]
【讨论】:
让我们给你的列表起个名字 - “arr”
arr=sort(key=lambda x:x[1],reverse=True)
输出 - [[name_e,10],[name_d,5],[name_a,5]]
【讨论】:
它不需要是你传递给sort方法的lambda函数,你实际上可以提供一个真正的函数,因为它们是python中的一等对象。
L.sort(my_comparison_function)
应该没问题
【讨论】: