Python自定義排序指南

一、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-tw/n/309601.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-04 19:31
下一篇 2025-01-04 19:31

相關推薦

  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29

發表回復

登錄後才能評論