python的排序中,可以使用內置的sort()來對序列進行排序,也可以使用內置的sorted()函數對序列進行排序,區別是,當使用sort()時,是對原序列進行排序,而sorted()則是生成一個新的序列。
1、采用sorted()對序列進行排序,返回一個新的序列
1 #使用sorted()函數對序列進行排序 2 x = [5,2,3,1,4] 3 y = sorted(x) 4 print(y) #[1, 2, 3, 4, 5] 5 print(id(x)) #1576453618504 6 print(id(y)) #1576446734280
2、采用內置的sort()對序列進行排序,返回值為None,對原序列進行排序
1 #使用sort()對序列進行排序 2 a = [5,2,3,1,4] 3 a.sort() 4 print(a) #[1, 2, 3, 4, 5]
通常sort()並沒有sorted()方便,但是當不需要原序列時,sort()也還可以。
從python2.4開始,list.sort()和sorted()增加了一個key參數,從而對排序規則進行定義
1 #定義key值對序列進行排序 2 lst = sorted('This is a test string from Andrew'.split(),key=str.lower) 3 print(lst) #['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
注意:key參數的值應該是一個函數,它接受一個參數並返回一個用於排序目的的鍵。 這種技術速度很快,因為每個輸入記錄只需要調用一次關鍵函數。
當需要對一些復雜的對象進行排序時,可以采用復雜對象里面的一些參數作為排序的參數:
1 #復雜對象的排序 2 student_tuple = [ 3 ('john','A',15), 4 ('jane','B',12), 5 ('dave','B',10), 6 ] 7 lst = sorted(student_tuple,key=lambda student:student[2]) #按照年齡排序 8 print(lst) #[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
同樣的技術適用於具有命名屬性的對象:
1 #復雜對象的排序: 2 class Student: 3 def __init__(self,name,grade,age): 4 self.name = name 5 self.grade = grade 6 self.age = age 7 def __repr__(self): 8 return repr((self.name,self.grade,self.age)) 9 def weighted_grade(self): 10 return 'CBA'.index(self.grade)/float(self.age) 11 student_objects = [ 12 Student('john','A',15), 13 Student('jane','B',12), 14 Student('dave','B',10), 15 ] 16 lst = sorted(student_objects,key=lambda student:student.age) 17 print(lst) #[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
上面采用的key值的方式對序列進行排序,在python中還提供更快更簡單的排序函數,也就是operator模塊,其中的itemgetter、attrgetter以及在python2.6中出現的methodcaller
未完待續
yang