作者|Luay Matalka
編譯|VK
來源|Towards Datas Science
在本教程中,我們將了解如何根據不同的標準對可迭代的容器(如串列、元組、字串和字典)進行排序,
對串列排序
有兩種方法可以對串列進行排序,我們可以使用sort()方法或sorted()函式,sort()方法是一個串列方法,因此只能用于串列,sorted()函式適用于任何容器,
sort()方法
sort()方法是一個串列方法,它就地修改串列并回傳None,換句話說,sort()方法修改或更改呼叫它的串列,而不創建新串列,
sort()方法有兩個可選引數:key引數和reverse引數,key引數接受一個接受單個引數并回傳用于排序的鍵的函式,
默認情況下,sort()方法將按數字的值和字串的字母順序對串列進行排序,reverse引數接受布林值True或False,reverse的默認值為False,這意味著它按升序排序,為了按降序排序,我們將設定reverse=True,當我們看下面的一些例子時,這些引數將更有意義,
對數字串列排序
假設我們有一個數字串列,我們想按升序排序,
num_list = [1,-5,3,-9,25,10]
num_list.sort()
print(num_list)
# [-9,-5,1,3,10,25]
所以我們有一個num_list串列,我們對此串列呼叫sort()方法,請注意,我們沒有為鍵引數傳遞值,因此,它只是根據實際值對這個num_list進行排序,因為我們沒有設定reverse=True,所以它按升序排序,sort()方法修改了num_list,
如果我們想根據數字的絕對值對串列進行排序呢?這時我們需要使用key引數,key引數接受一個接受單個引數并回傳用于排序的鍵的函式,
num_list = [1,-5,3,-9,25,10]
def absolute_value(num):
return abs(num)
num_list.sort(key = absolute_value)
print(num_list)
# [1,3,-5,-9,10,25]
我們定義了一個函式,absolute_value,它接受一個數字并回傳它的絕對值,然后,我們將此函式作為sort()方法的鍵引數的引數傳入,因此,在進行比較之前,它通過絕對值函式運行num_list的每個元素或數字,因此,這些數字的絕對值將用于按升序對該串列進行排序(因為reverse默認設定為False),
使用lambda運算式
我們可以為鍵引數傳入lambda運算式,如下所示:
num_list.sort(key = lambda num: abs(num))
請在此處查看有關lambda運算式的教程:
https://towardsdatascience.com/lambda-expressions-in-python-9ad476c75438
請記住,sort()方法回傳None,因此,如果我們將sort()方法的輸出或回傳值設定為一個新變數,則如下所示:
new_list = num_list.sort(key = absolute_value)
print(new_list)
# None
使用內置函式
我們不必像上面那樣撰寫我們自己的絕對值函式,而只需為鍵引數傳入python內置的abs()函式,如下所示:
num_list.sort(key = abs)
sorted()函式
sorted()函式可以接受三個引數:容器、key和reverse,sorted()函式可以處理任何可迭代的容器,例如串列、元組、字典等,但是,與sort()方法不同的是sort()方法回傳None并修改原始串列,sorted()函式回傳一個新串列,同時保持原始物件不變,
讓我們再次使用絕對值對num_list排序,但使用sorted()函式:
num_list = [1,-5,3,-9,25,10]
new_list = sorted(num_list, key = abs)
print(new_list)
# [1,3,-5,-9,10,25]
print(num_list)
# [1,-5,3,-9,25,10]
我們將容器 num_list傳遞給sorted()函式,同時將內置的abs函式傳遞給key引數,我們將sorted()函式的輸出設定為一個新變數new_list,注意num_list是如何保持不變的,因為sorted()函式不會修改它所作用的容器,
注意:不管傳入sorted()函式的容器是什么,它總是回傳一個串列,
排序元組串列
假設我們有一個元組串列,串列的每個元素都是一個元組,包含三個元素:姓名、年齡和薪水,
list_of_tuples = [
('john', 27, 45000),
('jane', 25, 65000),
('beth', 31, 70000)
]
我們可以按字母順序,按年齡,或按薪水來排序,我們可以指定要與鍵引數一起使用的物件,
要按年齡排序,我們可以使用以下代碼:
sorted_age_list = sorted(list_of_tuples, key = lambda person: person[1])
print(sorted_age_list)
# [('jane', 25, 65000), ('john', 27, 45000), ('beth', 31, 70000)]
list_of_tuples的每個元素都作為person引數傳遞給lambda函式,在每個元組元素的索引1處回傳,這是用于對串列排序的值,即年齡,
為了按字母順序對名稱進行排序,我們可以在不傳遞任何鍵的情況下執行此操作,因為默認情況下,每個元組的第一個元素是被比較的(記住,默認情況下,字串是按字母順序排序的):
sorted_name_list = sorted(list_of_tuples)
print(sorted_name_list)
# [('beth', 31, 70000), ('jane', 25, 65000), ('john', 27, 45000)]
但是,我們可以指定要按每個元組的第一個元素排序,如下所示:
sorted_name_list = sorted(list_of_tuples, key = lambda person: person[0])
print(sorted_name_list)
# [('beth', 31, 70000), ('jane', 25, 65000), ('john', 27, 45000)]
請記住,我們可以為變數分配lambda運算式(類似于使用def關鍵字定義函式),因此,我們可以根據lambda運算式用于對串列排序的條件來組織它們:
name = lambda person: person[0]
age = lambda person: person[1]
salary = lambda person: person[2]
#按名稱排序
sorted(list_of_tuples, key = name)
#按年齡排序
sorted(list_of_tuples, key = age)
#按薪資排序
sorted(list_of_tuples, key = salary)
itemgetter()函式
我們可以使用operator模塊中的itemgetter()函式,而不是使用lambda運算式從元組中訪問name、age或salary元素,
我們可以通過傳入索引來指定要訪問元組中的哪個元素,串列中的每個元組都被傳遞給itemgetter()函式,并根據指定的索引回傳該元組中的特定元素,
import operator
#按名稱排序
sorted(list_of_tuples, key = operator.itemgetter(0))
#按年齡排序
sorted(list_of_tuples, key = operator.itemgetter(1))
#按薪資排序
sorted(list_of_tuples, key = operator.itemgetter(2))
函式的作用是:允許多級排序,例如,假設我們有一個元組串列:
list_of_tuples = [
('john', 27, 45000),
('jane', 25, 65000),
('joe', 25, 35000),
('beth', 31, 70000)
]
注意jane和joe的年齡都一樣,因此,如果我們想先按年齡排序,再按薪水排序,我們可以將兩個值傳遞給itemgetter()函式:
print(sorted(list_of_tuples, key=operator.itemgetter(1,2))
# [('joe', 25, 35000), ('jane', 25, 65000), ('john', 27, 45000), ('beth', 31, 70000)]
由于age的索引是傳入的第一個值,因此它將首先用于對元素進行排序,如果年齡相同,將使用salary對元素進行排序,
還可以使用名為attr()的屬性對getter()進行排序,例如,如果我們撰寫了自己的類并實體化了該類的物件,則可以使用attrgetter()函式使用特定的命名屬性對這些物件進行排序,
我們只需將屬性的名稱傳遞給attrgetter()函式,然后將該函式傳遞到sorted()函式的鍵引數中,例如,為了按年齡對物件排序,我們將把以下內容傳遞給key引數:key = attrgetter(‘age’).,
對元組排序
對元組進行排序與使用sorted()函式對串列排序相同,此外,由于元組是不可變的物件,因此我們不能使用sort()方法,因為sort()方法修改了原始串列,
請記住,即使我們將元組傳遞給sorted()函式,也會回傳一個串列,
num_tuple = (5,2,53,9,25)
sorted_tuple = sorted(num_tuple)
print(sorted_tuple)
# [2,5,9,25,53]
對字串排序
字串是可調的,因此,也可以使用sorted()函式對它們進行排序,sorted()函式將逐字符遍歷字串,默認情況下,sorted()函式將按字母順序對字串進行排序,
sorted_string = sorted(‘dinosaur’)
print(sorted_string)
# ['a','d','i','n','o','r','s','u']
注意sorted()函式如何按字母順序回傳字串列,
對字典排序
字典由key:value對組成,因此,可以按鍵或值進行排序,
假設我們有一個字典,鍵是名字,值是年齡,
dictionary_of_names = {'beth': 37,
'jane': 32,
'john': 41,
'mike': 59
}
如果我們只是將整個字典作為容器傳遞給sorted()函式,我們將得到以下輸出:
print(sorted(dictionary_of_names))
# ['beth', 'jane', 'john', 'mike']
如我們所見,如果我們將整個字典作為容器傳遞給sorted()函式,它將回傳一個只包含按字母順序排序的鍵的串列,
使用items()方法
如果要獲取整個字典的排序副本,則需要使用dictionary items()方法:
print(dictionary_of_names.items())
# dict_items([('beth', 37), ('jane', 32), ('john', 41), ('mike', 59)])
請注意items()方法如何回傳dict_items物件,該物件看起來類似于元組串列,這個dict_items物件是一個容器,它可以作為容器傳遞給sorted()函式,
我們可以像對前面看到的元組串列排序一樣,對dict_items物件進行排序,例如,要按每個元組中的第二個元素(即年齡)進行排序,可以使用以下代碼:
sorted_age = sorted(dictionary_of_names.items(), key = lambda kv: kv[1])
print(sorted_age)
# [('jane', 32), ('beth', 37), ('john', 41), ('mike', 59)]
請注意sorted()函式是如何回傳元組串列的,這些元組按年齡(或每個元組中的第二個元素)排序,要將此元組串列轉換為字典,可以使用內置的dict()函式:
sorted_dictionary = dict(sorted_age)
print(sorted_dictionary)
# {'jane': 32, 'beth': 37, 'john': 41, 'mike': 59}
現在我們有一個按年齡分類的字典!
結論
在本教程中,我們比較了排序串列時sort()方法和sorted()函式,我們學習了sort()方法如何修改原始串列,sorted()函式回傳一個新串列,我們還了解到sort()方法只對串列有效,但是sorted()函式可以處理任何容器,然后我們學習了如何對不同型別的容器進行排序并使用不同的標準,
原文鏈接:https://towardsdatascience.com/the-ultimate-guide-to-sorting-in-python-d07349fb96d5
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/149601.html
標籤:其他
上一篇:Python相關資料結構的排序
下一篇:html入門基礎(詳解)
