Python3 list 排序函數詳解

Python3 list 排序函數詳解

一、 列表的sort排序函數

函數原型:

list.sort(key=None,reverse=False)

函數功能:

對原列表進行排序,完成排序後,原列表變為有序列表。默認情況(不傳入任何參數時)按字典順序排序。

函數參數:

(1) key: 主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自於可迭代對象中。指定可迭代對象中的一個元素來進行排序指定排序時使用的單個元素或多個元素、lambda表達式;

(2) reverse:指字排序規則是升序還是降序,默認為升序排序;

二、 排序示例

1. 字符串排序


def list_sort_string():
list=["delphi","Delphi","python","Python","c++","C++","c","C","golang","Golang"]
list.sort() #按字典順序升序排列
print("升序:",list)


list.sort(reverse=True) #按降序排列
print("降序:",list)

排序結果:


升序: ['C', 'C++', 'Delphi', 'Golang', 'Python', 'c', 'c++', 'delphi', 'golang', 'python']
降序: ['python', 'golang', 'delphi', 'c++', 'c', 'Python', 'Golang', 'Delphi', 'C++', 'C']

2. 數值型排序


def list_sort_number():
list=[30,40,10,50,50.1,80,60,100,90]
list.sort()
print("升序:",list)

list.sort(reverse=True)
print("降序:",list)

排序結果:


升序: [10, 30, 40, 50, 50.1, 60, 80, 90, 100]
降序: [100, 90, 80, 60, 50.1, 50, 40, 30, 10]

3. 根據列表中類對象的屬性排序


class element(object):
def __init__(self,id="",name=""):
self.id=id
self.name=name
def __lt__(self, other): # override if self.id return True
return False

def __str__(self): # override __str__
return "id={0},name={1}".format(self.id,self.name)

def sort_by_attribute():

list=[element(id="130",name="json"),
element(id="01",name="jack"),element(id="120",name="tom")]
list.sort()
for item in list:
print(item)

由於list.sort()函數在排序時,使用的是小於號對比,所以自定義的數據類型需要override __lt__(小於)函數才能實現排序。

根據element的id屬性排序

排序列的結果:


id=01,name=jack
id=120,name=tom
id=130,name=json

4. 根據列表中元素的長度排序


def list_sort_by_length():
list=["delphi","Delphi","python","Python","c++","C++","c","C","golang","Golang"]
list.sort(key=lambda ele:len(ele)) #按元素長度順序升序排列
print("升序:",list)

list.sort(key=lambda ele:len(ele),reverse=True) #按降序排列
print("降序:",list)

藉助於lambda表達式,計算list列表中的元素的長度,根據元素的長度進行排序

排序的結果:


升序: ['c', 'C', 'c++', 'C++', 'delphi', 'Delphi', 'python', 'Python', 'golang', 'Golang']

降序: ['delphi', 'Delphi', 'python', 'Python', 'golang', 'Golang', 'c++', 'C++', 'c', 'C']

5. 根據列表中元素的多個屬性進行排序:


def two_d_list_sort():
list=[ ["1","c++","demo"],
["1","c","test"],
["2","java",""],
["8","golang","google"],
["4","python","gil"],
["5","swift","apple"]
]
list.sort(key=lambda ele:ele[0])# 根據第1個元素排序
print(list)
list.sort(key=lambda ele:ele[1]) #先根據第2個元素排序
print(list)
list.sort(key=lambda ele:(ele[1],ele[0])) #先根據第2個元素排序,再根據第1個元素排序
print(list)

同樣藉助於lambda表達式完成,當然也可以定義一個與labmda具有相同意義的函數實現排序。

排序結果:


[['1', 'c++', 'demo'], ['1', 'c', 'test'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple'], ['8', 'golang', 'google']]
[['1', 'c', 'test'], ['1', 'c++', 'demo'], ['8', 'golang', 'google'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple']]
[['1', 'c++', 'demo'], ['1', 'c', 'test'], ['8', 'golang', 'google'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple']]

6. 動態的根據用戶指定的索引進行排序


有時候,在寫代碼之前,並不知道根據二維表的哪幾列排序,而是在程序運行的時候根據輸入或配置決定的,為了解決這個動態根據多個列或屬性排序的問題,藉助了eval()函數,eval函數能夠把字符串編譯成python代碼並運行,從而達到動態根據多個列或屬性排序的目的。

排序結果:


排序索引: 0 [['1', 'c++', 'demo'], ['1', 'c', 'test'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple'], ['8', 'golang', 'google']]
排序索引: 1 [['1', 'c', 'test'], ['1', 'c++', 'demo'], ['8', 'golang', 'google'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple']]
排序索引: 2 [['2', 'java', ''], ['5', 'swift', 'apple'], ['1', 'c++', 'demo'], ['4', 'python', 'gil'], ['8', 'golang', 'google'], ['1', 'c', 'test']]
排序索引: 1,0 [['1', 'c++', 'demo'], ['1', 'c', 'test'], ['8', 'golang', 'google'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple']]

綜上,基本總結了list.sort的使用的大部分場景,如下:

1、默認排序

2、根據類對象的單個屬性進行排序,當然也可以擴展為根據類對象的多個屬性進行排序

3、根據元素的固有屬性進行排序,如:長度、第N個元素等。為了簡單,所以藉助了lambda表達式,當然也可以使用普通函數代替lambda表達式

4、動態的根據多個列進行排序,同時藉助lambda和eval()函數實現

5、另外相比Python2,Python3取消了sort函數中的 cmp方式,只能用key方式。

所以python2用cmp方式寫的函數遷移到python3中需要轉換。

from functools import cmp_to_key

sort(iterable, key=cmp_to_key(cmp_fun))

Python3 list 排序函數詳解


分享到:


相關文章: