詳解Python3中的自定義排序
在Python編程中,排序是一項常見的操作。Python提供了強(qiáng)大的排序功能,通過sorted()函數(shù)和列表的sort()方法,可以方便地對列表進(jìn)行排序。這兩個方法都支持key參數(shù),允許開發(fā)者自定義排序規(guī)則。本文將通過詳細(xì)的方法和示例,講解如何在Python3中實(shí)現(xiàn)自定義排序。
一、基礎(chǔ)排序
Python的sorted()函數(shù)返回一個新的列表,而列表的sort()方法則直接對原列表進(jìn)行排序,不返回任何值(返回值為None)。
# 基礎(chǔ)示例 numbers = [5, 2, 9, 1, 5, 6] sorted_numbers = sorted(numbers) print(sorted_numbers) # 輸出: [1, 2, 5, 5, 6, 9] #使用sort()方法: python numbers = [5, 2, 9, 1, 5, 6] numbers.sort() print(numbers) # 輸出: [1, 2, 5, 5, 6, 9]
二、自定義排序規(guī)則
通過key參數(shù),可以自定義排序規(guī)則。key參數(shù)接收一個函數(shù),該函數(shù)會接收列表中的每一個元素作為參數(shù),并返回一個值作為該元素的排序優(yōu)先級。
2.1 按字符串長度排序
words = ["apple", "banana", "cherry", "date"] sorted_words = sorted(words, key=len) print(sorted_words) # 輸出: ['date', 'apple', 'banana', 'cherry']
2.2 按元組的第二個元素排序
pairs = [(1, 3), (4, 1), (2, 5), (3, 2)] sorted_pairs = sorted(pairs, key=lambda x: x[1]) print(sorted_pairs) # 輸出: [(4, 1), (3, 2), (1, 3), (2, 5)]
2.3 降序排序
通過reverse=True參數(shù),可以實(shí)現(xiàn)降序排序。
numbers = [5, 2, 9, 1, 5, 6] sorted_numbers_desc = sorted(numbers, reverse=True) print(sorted_numbers_desc) # 輸出: [9, 6, 5, 5, 2, 1]
使用sort()方法時也可以指定reverse=True:
numbers = [5, 2, 9, 1, 5, 6] numbers.sort(reverse=True) print(numbers) # 輸出: [9, 6, 5, 5, 2, 1]
2.4 多條件排序
有時需要根據(jù)多個條件進(jìn)行排序,例如先按一個字段排序,再按另一個字段排序。
people = [('Alice', 25), ('Bob', 30), ('Alice', 22)] sorted_people = sorted(people, key=lambda x: (x[0], x[1])) print(sorted_people) # 輸出: [('Alice', 22), ('Alice', 25), ('Bob', 30)]
三、使用lambda表達(dá)式定義復(fù)雜排序規(guī)則
lambda表達(dá)式可以用于定義更復(fù)雜的排序規(guī)則。
3.1 按字典值排序
people = {"Alice": 30, "Bob": 25, "Charlie": 35} sorted_people = sorted(people.items(), key=lambda x: x[1]) print(sorted_people) # 輸出: [('Bob', 25), ('Alice', 30), ('Charlie', 35)]
3.2 對類對象排序
可以創(chuàng)建一個類,并根據(jù)類的屬性對對象進(jìn)行排序。
class Person: def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return f"Person{name=self.name, age=self.age}" # 創(chuàng)建Person對象 people = [Person("Alice", 30), Person("Bob", 25), Person("Charlie", 35)] # 按年齡排序 sorted_people = sorted(people, key=lambda person: person.age) for person in sorted_people: print(person) # 輸出: Person{name='Bob', age=25}, Person{name='Alice', age=30}, Person{name='Charlie', age=35}
四、使用functools.cmp_to_key進(jìn)行傳統(tǒng)比較
當(dāng)需要使用傳統(tǒng)的比較函數(shù)(cmp函數(shù))時,可以使用functools.cmp_to_key進(jìn)行轉(zhuǎn)換。
from functools import cmp_to_key # 自定義比較函數(shù) def compare(a, b): if a % 2 == b % 2: return a - b # 相同類型(奇偶性)按大小排序 return -1 if a % 2 == 0 else 1 # 偶數(shù)優(yōu)先 numbers = [1, 2, 3, 4, 5, 6, 7, 8] sorted_numbers = sorted(numbers, key=cmp_to_key(compare)) print(sorted_numbers) # 輸出: [2, 4, 6, 8, 1, 3, 5, 7]
五、復(fù)雜數(shù)據(jù)結(jié)構(gòu)排序示例
假設(shè)有一個包含列車信息的列表,需要根據(jù)“二等座”是否有票以及“歷時”進(jìn)行排序。
tickets = [ {'車次': 'G1', '歷時': "1:23", '二等座': "有"}, {'車次': 'G2', '歷時': "1:00", '二等座': "有"}, {'車次': 'G3', '歷時': "0:23", '二等座': "13"}, {'車次': 'G4', '歷時': "1:55", '二等座': "44"}, {'車次': 'G5', '歷時': "0:21", '二等座': "13"}, {'車次': 'G6', '歷時': "1:55", '二等座': "44"} ] # 定義比較函數(shù) def cmp_seat(t1, t2): if t1["二等座"] == "有": if t2["二等座"] == "有": return 0 else: return -1 else: if t2["二等座"] == "有": return 1 else: return int(t2["二等座"]) - int(t1["二等座"]) def cmp_time(t1, t2): hs1 = t1["歷時"].split(":") hs2 = t2["歷時"].split(":") tm1 = int(hs1[0]) * 60 + int(hs1[1]) tm2 = int(hs2[0]) * 60 + int(hs2[1]) return tm1 - tm2 def cmp(t1, t2): if cmp_seat(t1, t2) != 0: return cmp_seat(t1, t2) else: return cmp_time(t1, t2) # 使用cmp_to_key進(jìn)行排序 tickets.sort(key=cmp_to_key(cmp)) for ticket in tickets: print(ticket)
在這個例子中,cmp_seat函數(shù)用于比較“二等座”是否有票,cmp_time函數(shù)用于比較“歷時”,cmp函數(shù)則綜合這兩個條件進(jìn)行比較。最終通過tickets.sort(key=cmp_to_key(cmp))實(shí)現(xiàn)排序。
六、總結(jié)
Python的自定義排序功能非常強(qiáng)大,通過key參數(shù)和functools.cmp_to_key,可以靈活地定義排序規(guī)則。無論是簡單的數(shù)據(jù)類型(如整數(shù)和字符串),還是復(fù)雜的對象,都可以輕松實(shí)現(xiàn)自定義排序。掌握自定義排序,可以大大增強(qiáng)對數(shù)據(jù)的處理能力,為數(shù)據(jù)分析和處理提供更強(qiáng)大的支持。
通過本文的示例,希望讀者能夠深刻理解Python自定義排序的用法,并在實(shí)際編程中靈活運(yùn)用。自定義排序不僅限于上述示例,開發(fā)者可以根據(jù)實(shí)際需求,設(shè)計出更加復(fù)雜和高效的排序規(guī)則。
到此這篇關(guān)于詳解Python3中的自定義排序的文章就介紹到這了,更多相關(guān)Python3自定義排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中的tkinter庫彈窗messagebox詳解
這篇文章主要介紹了python中的tkinter庫彈窗messagebox,包括消息提示框、消息警告框、錯誤消息框,通過代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-06-06Python+selenium實(shí)現(xiàn)趣頭條的視頻自動上傳與發(fā)布
本文主要介紹了通過Python+selenium實(shí)現(xiàn)趣頭條的短視頻自動上傳與發(fā)布功能,同時支持抖音、快手、b站、小紅書等平臺的視頻自動化同步發(fā)布。需要的朋友可以參考一下2021-12-12PyQt實(shí)現(xiàn)計數(shù)器的方法示例
這篇文章主要介紹了PyQt實(shí)現(xiàn)計數(shù)器的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01python?subprocess執(zhí)行外部命令常用方法詳細(xì)舉例
這篇文章主要給大家介紹了關(guān)于python?subprocess執(zhí)行外部命令常用方法的相關(guān)資料,Python的subprocess模塊提供了一種在Python中調(diào)用外部命令的方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Python學(xué)習(xí)筆記之文件的讀寫操作實(shí)例分析
這篇文章主要介紹了Python學(xué)習(xí)筆記之文件的讀寫操作,結(jié)合實(shí)例形式詳細(xì)分析了Python常見的文件讀寫操作實(shí)現(xiàn)技巧及相關(guān)注意事項,需要的朋友可以參考下2019-08-08