python 排序 sorted 如果第一個條件 相同 則按第二個條件排序


怎樣遍歷一個list  符合下列條件

1. 按照元組的第一個從小到大排序
2. 如果第一個相同  則按照元組第2個從大到小 排序
a = [[2,3],[4,1],(2,8),(2,1),(3,4)]
b = sorted(a,key=lambda x: (x[0], -x[1]))
print b

 
a = [[2,{'a':8}],[4,{'a':1}],(2,{'a':8}),(2,{'a':1}),(3,{'a':4})]
array = [7,8]
def fun(x):
    return (-x[0],x[1].get('a'))
b = sorted(a,key=fun)
print b
 
性能這玩意還是要用數據說話
import time

n = xrange(1000000)
x = zip(n, n)

start = time.time()
x.sort(key = lambda x: (x[0], -x[1]))
end = time.time()
print 'key', end-start

x = zip(n, n)
start = time.time()
x.sort(cmp=lambda x, y: x[0] - y[0] or y[1] - x[1])
end = time.time()
print 'cmp', end-start
輸出:

key 2.34500002861 cmp 0.269000053406

key的代碼確實優雅些,但不管從直觀上,還是實測結果,都看不出來key更快。
如果逆序不能前面加個 '-'  來解決 , 可以用下面的辦法  例如: 排序的是個字符串
class Reversinator(object):
    def __init__(self, obj):
        self.obj = obj
    def __lt__(self, other):
        return other.obj < self.obj

a = [(2,'3'),(4,'1'),(2,'8'),(2,'1'),(3,'4')]

print sorted(a, key=lambda x: (x[0], Reversinator(x[1])))
補充:
Python本身提供了排序功能,其排序算法是穩定的,即key相等的兩項在排序后的先后次序不變
下面通過list.sort來演示一下如何通過key函數來進行自定義的排序
所謂的key函數,就是以參加排序的每一項作為輸入,而輸出則為用來排序的key
 
#python list 排序 

   

def my_key1(x): 

    return x % 10 

aList = [4, 5, 1, 2, 12, 34, 56, 9 ,80] 

aList.sort() #默認按升序排列 

print(aList) 

aList.sort(reverse = True) #按降序排列 

print(aList) 

aList.sort(key = my_key1) #根據key函數,按照個位數進行升序排列 

print(aList) 

    

def my_key2(x): 

    return x[1] 

aList = [(4,'ab'), (56,'c'), (1,'bb'), (102, 'a')] 

aList.sort(key = my_key2) #按照每個元組的第2分量,即字符串排序 

print(aList)

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM