項目github位址:bitcarmanlee easy-algorithm-interview-and-practice
歡迎大家star,留言,一起學習進步
python中,list類型内置了sort()方法用于排序。當然,python還有内置的全局sorted()方法,用于可疊代序列的排序。這兩個方法大部分的用法是相同的,最大的不同在于,sort()方法不會生成一個新的list,而是在原有的list上進行修改;sorted()方法則是生成一個新的可疊代序列。
1.最簡單的排序
首先help一把list.sort()方法
In [1]: help(list.sort)
Help on method_descriptor:
sort(...)
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1
(END)
注:在python 3.x系列中,cmp參數已經被廢棄,由key參數指定即可。
list.sort()方法就可以對list進行排序。不過需要注意的是,此時原來的list将被修改。
In [2]: array=[5,3,1,7,9]
In [3]: array.sort()
In [4]: array
Out[4]: [1, 3, 5, 7, 9]
2.複雜對象排序
使用的更廣泛的情況是用複雜對象的某些值來實作複雜對象的排序。
例如:
In [5]: persons=[['lindan','A',20],['chenlong','A',18],['tiantian','B',18]]
In [6]: list.sort(persons,key=lambda person:person[2])
In [7]: persons
Out[7]: [['chenlong', 'A', 18], ['tiantian', 'B', 18], ['lindan', 'A', 20]]
使用operator子產品
In [8]: persons=[['lindan','A',20],['chenlong','A',18],['tiantian','B',18]]
In [9]: from operator import itemgetter,attrgetter
In [10]: list.sort(persons,key=itemgetter(2))
In [11]: persons
Out[11]: [['chenlong', 'A', 18], ['tiantian', 'B', 18], ['lindan', 'A', 20]]
3.對擁有命名屬性的複雜對象排序
也可以對某個擁有命名屬性的複雜對象進行排序(為了友善,使用sorted()方法,與list.sort()方法本質是一樣的)
class Person:
def __init__(self,name,hierarchy,age):
self.name = name
self.hierarchy = hierarchy
self.age = age
def __repr__(self):
return repr((self.name,self.hierarchy,self.age))
#按年齡排序
def sort_age():
Persons = [Person('kobe','A',20),Person('janes','A',18),Person('Tracy','B',18)]
p_age = sorted(Persons,key = attrgetter('age'),reverse = True)
print p_age
#先按年齡,再按名字排序
def sort_age_hierarchy():
Persons = [Person('kobe','A',20),Person('janes','A',18),Person('Tracy','B',18)]
p_sorted = sorted(Persons,key = attrgetter('age','name'),reverse = True)
print p_sorted
if __name__ == '__main__':
sort_age()
sort_age_hierarchy()
結果如下:
[('kobe', 'A', 20), ('janes', 'A', 18), ('Tracy', 'B', 18)]
[('kobe', 'A', 20), ('janes', 'A', 18), ('Tracy', 'B', 18)]