一、Python自定義排序規則
在Python中,我們可以使用sort()函數進行列表排序。sort()函數內部使用一個默認的排序規則,按照數字大小進行排序,按照字典序進行字符串排序,但是有時候我們需要按照自己定義的規則進行排序。可以使用sort()函數的key參數來指定自定義排序規則。
# 按照列表元素的絕對值大小進行排序 l = [3,-5,1,-2,4] l.sort(key=abs) print(l) # 輸出結果:[1, -2, 3, 4, -5]
上述代碼中,我們定義了一個自定義排序規則,按照列表元素的絕對值大小進行排序。
二、Python自定義類
如果需要按照自己定義的規則進行排序,可以先定義一個類,該類可以實現__lt__()方法,在該方法中定義自己的排序規則。
class Student: def __init__(self,name,age,score): self.name = name self.age = age self.score = score def __lt__(self,other): return self.score < other.score s1 = Student('Alice',20,90) s2 = Student('Bob',22,80) s3 = Student('Charlie',21,95) students = [s1,s2,s3] students.sort() for student in students: print(student.name,student.age,student.score) # 輸出結果: Charlie 21 95 Alice 20 90 Bob 22 80
上述代碼中,我們定義了一個名為Student的類,該類擁有姓名、年齡和分數這三個屬性。我們實現了__lt__()方法,定義按照分數從小到大的排序規則。最後使用sort()函數對學生列表進行排序。
三、Python自定義排序函數
我們可以直接定義一個排序函數,該函數可以接受一個參數,返回該參數的排序依據,sort()函數的key參數可以傳入這個函數進行自定義排序。
def sort_key(st): return st[1] students = [('Alice',20,90),('Bob',22,80),('Charlie',21,95)] students.sort(key=sort_key) for student in students: print(student[0],student[1],student[2]) # 輸出結果: Bob 22 80 Alice 20 90 Charlie 21 95
上述代碼中,我們定義了一個名為sort_key的函數,該函數接受一個參數st,返回該元組的第二個元素作為排序依據。最後使用sort()函數對學生列表進行排序。
四、Python list自定義排序
除了可以使用sort()函數之外,Python中還有另外一種排序方式,可以使用sorted()函數對列表進行排序。sorted()函數可以接受三個參數,分別是要排序的列表、排序規則以及reverse參數,該參數默認為False,表示升序排列,如果設置為True,則表示降序排列。
l = [(3,6),(2,1),(1,4),(4,3)] l_sorted = sorted(l,key=lambda x: x[1],reverse=True) print(l_sorted) # 輸出結果: [(3, 6), (1, 4), (4, 3), (2, 1)]
上述代碼中,我們使用sorted()函數對列表進行了排序,排序規則是按照元組的第二個元素從大到小排序。
五、排序函數Python
Python中還有其他一些排序函數,比如heapq模塊中的heapify()和heappop()函數,可以用於堆排序,內置的sorted()函數也可以用於堆排序。
import heapq l = [3,-5,1,-2,4] heapq.heapify(l) # 構建小根堆 print([heapq.heappop(l) for i in range(len(l))]) # 將堆中元素逐一彈出 # 輸出結果: [-5, -2, 1, 3, 4] l = [3,-5,1,-2,4] print(sorted(l)) # 輸出結果: [-5, -2, 1, 3, 4]
上述代碼中,我們使用heapq模塊中的heapify()函數將一個列表構建成了小根堆,然後使用heappop()函數將堆中元素逐一彈出。在第二個例子中,我們使用Python內置的sorted()函數對列表進行排序。
六、不使用函數用Python排序
除了使用函數之外,我們也可以直接使用Python提供的排序方法進行排序。
l = [(3,6),(2,1),(1,4),(4,3)] l_sorted = sorted(l,key=lambda x: x[1],reverse=True) print(l_sorted) # 輸出結果: [(3, 6), (1, 4), (4, 3), (2, 1)]
上述代碼中,我們使用sorted()函數對列表進行了排序,排序規則是按照元組的第二個元素從大到小排序。
七、Python自定義排序規則撲克牌
以撲克牌為例,我們定義了一個Card類,其中花色和點數分別使用字典進行映射。
class Card: suits = ['♠', '♥', '♣', '♦'] faces = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'] def __init__(self,suit,face): self.suit = suit self.face = face def __repr__(self): return self.suits[self.suit] + self.faces[self.face] # 創建一副撲克牌 deck = [Card(s,f) for s in range(4) for f in range(13)] # 輸出一副撲克牌 print(deck) # 對撲克牌按照點數進行排序 deck_sorted = sorted(deck,key=lambda c:c.face) print(deck_sorted) # 對撲克牌按照點數、花色進行排序 deck_sorted2 = sorted(deck,key=lambda c:(c.face,c.suit)) print(deck_sorted2)
上述代碼中,我們定義了一個Card類,用於描述撲克牌,其中花色和點數分別使用字典進行映射。我們創建了一副撲克牌,並對撲克牌按照點數進行排序,使用的是sorted()函數。最後我們對撲克牌按照點數、花色進行排序,需要在lambda函數中同時傳入點數和花色。
八、Python sort自定義排序函數
除了sorted()函數之外,list對象還提供了一個sort()方法可以對列表進行排序,sort()方法和sorted()函數的用法類似。我們可以在sort()方法中傳入一個可調用對象來指定排序規則。
cards = [Card(s,f) for s in range(4) for f in range(13)] def spades_high(card): rank_value = Card.faces.index(card.face) return rank_value * len(Card.suits) + card.suit cards.sort(key=spades_high) print(cards)
上述代碼中,我們定義了一個spades_high()函數,該函數接受一個Card對象,並返回一個整數值,用於表示該Card對象的大小。我們調用了sort()方法,並傳入了spades_high函數作為排序規則。最後輸出的是一副按照點數、花色從小到大排列的撲克牌。
九、結語
在Python中,自定義排序規則是非常方便的。我們可以根據需要定義一個比較函數,也可以通過定義一個類來實現自定義排序規則。無論是使用sort()函數還是sorted()函數,都非常方便。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/309601.html