一、清單内建方法--sort()
作用:就地對清單排序(直接在原清單上做排序)
文法:
list.sort(func=None, key=None, reverse=False)
- 當reverse=False時:正向排序;當reverse=True時:逆向排序。預設為False。
- 執行完後會改變原來的list,如果你不需要原來的list,這種效率稍微高點
- 該方法沒有傳回值
例子:
>>> arr = [2,8,4,6,9,1,3]
>>> arr.sort()
>>> arr
[1, 2, 3, 4, 6, 8, 9]
二、内建函數sorted()
作用:對可疊代對象排序,傳回一個新的已經排序好的list
差别:
- sorted()不會改變原來的list,而是會傳回一個新的已經排序好的list
- list.sort()方法隻是應用在 list 上的方法,而sorted()可用于任何一個可疊代對象
文法:
sorted(iterable, key=None, reverse=False)
- 當reverse=False時:為正向排序;當reverse=True時:為反向排序。預設為False。
- 執行完後傳回一個新的排序好的list
例子:
>>> arr = (3,6,7,2,1,4)
>>> sorted(arr)
[1, 2, 3, 4, 6, 7]
三、進階用法
參數key:
參數key:帶一個參數的函數(排序時,會依次傳入清單的每一項,作為該函數的參數)。該函數用于在比較排序之前進行的操作
例子:
每個字元串比較之前,需要統一小寫
>>> test=["A","a","E","W","o"]
>>> test.sort()
>>> test
['A', 'E', 'W', 'a', 'o']
>>> test.sort(key=lambda x:x.lower())
>>> test
['A', 'a', 'E', 'o', 'W']
對于複雜的對象,使用對象的下标作為key。
例子:
>>> student_tuples = [
... ('john', 'A', 15),
... ('jane', 'B', 12),
... ('dave', 'B', 10),
... ]
>>> sorted(student_tuples, key=lambda student: student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
使用對象的屬性進行操作:
>>> class Student:
... def __init__(self, name, grade, age):
... self.name = name
... self.grade = grade
... self.age = age
... def __repr__(self):
... return repr((self.name, self.grade, self.age))
>>>
>>> student_objects = [
... Student('john', 'A', 15),
... Student('jane', 'B', 12),
... Student('dave', 'B', 10),
... ]
>>> sorted(student_objects, key=lambda student: student.age) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
重點來了!
1.多元數組,如何在按照第一個元素排序的基礎上,再按第二個關鍵字進行排序?
>>> arr = [('d',3),('a',5),('d',1),('c',2),('d',2)]
>>> sorted(arr, key = lambda x:(x[0],x[1]))
[('a', 5), ('c', 2), ('d', 1), ('d', 2), ('d', 3)]
2.多元數組,如何實作第一個元素按升序,第二個元素按降序來排列?
>>> arr = [('d',3),('a',5),('d',1),('c',2),('d',2)]
>>> sorted(arr, key=lambda x:(x[0], -int(x[1])))
[('a', 5), ('c', 2), ('d', 3), ('d', 2), ('d', 1)]