首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python max() 函式完整指南:基本用法、自訂比較鍵值與進階應用範例

     編輯:更多程式設計知識

max() 函式核心功能

Python 內建 max() 函式用於回傳可迭代物件中的最大值,或多個引數中的最大值。支援數字、字串、元組等可比較型別,並提供 key 參數實現自訂比較邏輯。

基本用法

多個引數比較


print(max(1, 5, 3, 9, 2))      # 9
print(max('a', 'z', 'c'))      # 'z' (字典序)
print(max(3.14, 2.71, 1.41))   # 3.14

可迭代物件(列表、元組、集合)


numbers = [10, 5, 8, 20, 3]
print(max(numbers))        # 20
print(max((1, 5, 3)))      # 5
print(max({2, 8, 4}))      # 8

# 字串視為字元序列
print(max("hello"))        # 'o' (ASCII 碼最大)

key 參數:自訂比較鍵值

key 接受單引數函式,將每個元素轉換為比較用的鍵值,原元素不變:

字串長度比較


words = ['apple', 'banana', 'cherry', 'date']
print(max(words, key=len))        # 'banana' (長度 6)
print(max(words, key=lambda s: s[-1]))  # 'date' (按最後一字元比較)

複雜物件屬性比較


class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score
    def __repr__(self):
        return f"Student({self.name}, {self.score})"

students = [
    Student("Alice", 85),
    Student("Bob", 92),
    Student("Charlie", 78)
]

top_student = max(students, key=lambda s: s.score)
print(top_student)  # Student(Bob, 92)

# 使用 operator.attrgetter 更簡潔高效
from operator import attrgetter
print(max(students, key=attrgetter('score')))

字典值比較


scores = {'Alice': 85, 'Bob': 92, 'Charlie': 78}
print(max(scores, key=scores.get))  # 'Bob' (回傳鍵)
print(max(scores.values()))         # 92 (回傳值)
print(max(scores.items(), key=lambda kv: kv[1]))  # ('Bob', 92)

default 參數:處理空序列

Python 3.4+ 支援 default 避免 ValueError:


empty_list = []
print(max(empty_list, default=None))        # None
print(max(empty_list, default=float('-inf')))  # -inf

進階應用範例

多維度排序:先分數後名字


students = [
    ("Alice", 85),
    ("Bob", 92),
    ("Charlie", 85),
    ("David", 92)
]
# 分數降序、名字升序
print(max(students, key=lambda x: (x[1], -ord(x[0][0]))))
# 實務建議用 sorted 取前 N
top3 = sorted(students, key=lambda x: (-x[1], x[0]))[:3]

檔案大小找最大


import os
files = ['a.txt', 'b.log', 'c.py']
largest = max(files, key=os.path.getsize)
print(f"最大檔案: {largest} ({os.path.getsize(largest)} bytes)")

日期時間比較


from datetime import datetime
dates = [
    datetime(2023, 1, 15),
    datetime(2023, 3, 22),
    datetime(2022, 12, 31)
]
print(max(dates))  # 2023-03-22 00:00:00

min() 對應用法

min() 參數完全相同,回傳最小值:


print(min([5, 2, 8], key=lambda x: -x))  # 8 (按負值比較,相當於 max)

效能考量與最佳實務

場景建議做法時間複雜度
單次找最大值max(iterable)O(n)
需前 N 大heapq.nlargest(n, iterable)O(n log k)
頻繁插入/查詢最大heapq (最大堆用負值)O(log n)
已排序序列直接取 [-1]O(1)

heapq.nlargest 範例


import heapq
import random

data = [random.randint(1, 1000) for _ in range(10000)]
# 找前 5 大
top5 = heapq.nlargest(5, data)
print(top5)

# 針對複雜物件
top3_students = heapq.nlargest(3, students, key=lambda s: s.score)

常見錯誤與陷阱

  1. 空序列未處理:Python < 3.4 拋出 ValueError,務必用 default 或預先檢查
  2. key 函式副作用:key 應為純函式,避免修改原資料
  3. 自訂類別缺乏比較方法:若不使用 key,類別需實作 __lt__ 等豐富比較方法
  4. 字典直接 max():預設比較鍵而非值,需加 key=dict.get

原始碼層面理解(CPython 實作)

max() 在 C 層面實作為 builtin_max(),核心邏輯:

  • 單一可迭代引數:迭代一次,維護目前最大值
  • 多引數:視為元組處理
  • key 函式:每次比較前呼叫,結果快取避免重複計算

原始碼位置:Python/bltinmodule.c

總結

max() 是 Python 最實用的內建函式之一,搭配 key 參數能優雅解決各種「依特定條件找最大」問題。掌握 key、default、operator 模組輔助函式,以及何時改用 heapq,能寫出更簡潔、高效、Pythonic 的程式碼。記住:找單一最大值用 max,找前 N 大用 heapq.nlargest。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved