《关于python sorted函数的小实例》
在Python编程中,排序是数据处理的核心操作之一。无论是处理数字列表、字符串排序,还是对复杂对象进行自定义排序,Python内置的sorted()
函数都提供了简洁高效的解决方案。本文将通过多个实例,从基础到进阶,全面解析sorted()
函数的使用方法,帮助读者掌握这一实用工具。
一、sorted()函数基础
sorted()
是Python内置函数,用于对可迭代对象(如列表、元组、字符串等)进行排序,并返回一个新的排序后的列表。其基本语法如下:
sorted(iterable, key=None, reverse=False)
参数说明:
-
iterable
:需要排序的可迭代对象(如列表、字符串等)。 -
key
:可选参数,指定排序的依据(如字符串长度、对象属性等)。 -
reverse
:可选参数,默认为False
(升序),设为True
时为降序。
1.1 数字列表排序
最基础的用法是对数字列表进行升序或降序排序。
numbers = [3, 1, 4, 1, 5, 9, 2]
sorted_numbers = sorted(numbers)
print(sorted_numbers) # 输出: [1, 1, 2, 3, 4, 5, 9]
若需降序排序,设置reverse=True
:
sorted_numbers_desc = sorted(numbers, reverse=True)
print(sorted_numbers_desc) # 输出: [9, 5, 4, 3, 2, 1, 1]
1.2 字符串排序
对字符串排序时,默认按字符的Unicode码点升序排列。
text = "python"
sorted_text = sorted(text)
print(sorted_text) # 输出: ['h', 'n', 'o', 'p', 't', 'y']
若需将排序后的字符重新组合为字符串,可使用join()
方法:
sorted_text_str = ''.join(sorted(text))
print(sorted_text_str) # 输出: 'hnopty'
二、key参数的高级用法
key
参数允许自定义排序规则,通过指定一个函数来提取排序依据。这是sorted()
最强大的功能之一。
2.1 按字符串长度排序
对字符串列表按长度排序:
words = ["apple", "banana", "cherry", "date"]
sorted_words = sorted(words, key=lambda x: len(x))
print(sorted_words) # 输出: ['date', 'apple', 'banana', 'cherry']
2.2 按对象属性排序
假设有一个包含字典的列表,需按字典中的某个键值排序:
students = [
{"name": "Alice", "score": 85},
{"name": "Bob", "score": 92},
{"name": "Charlie", "score": 78}
]
sorted_students = sorted(students, key=lambda x: x["score"])
print(sorted_students)
# 输出: [{'name': 'Charlie', 'score': 78}, {'name': 'Alice', 'score': 85}, {'name': 'Bob', 'score': 92}]
2.3 多级排序
若需先按一个键排序,再按另一个键排序,可在key
函数中返回元组:
students = [
{"name": "Alice", "score": 85, "age": 20},
{"name": "Bob", "score": 92, "age": 19},
{"name": "Charlie", "score": 78, "age": 20}
]
# 先按score升序,再按age降序
sorted_students = sorted(students, key=lambda x: (x["score"], -x["age"]))
print(sorted_students)
# 输出: [{'name': 'Charlie', 'score': 78, 'age': 20}, {'name': 'Alice', 'score': 85, 'age': 20}, {'name': 'Bob', 'score': 92, 'age': 19}]
注:由于数字无法直接取负实现降序,更通用的方法是使用元组的第二个元素为-x["age"]
,或分两步排序(先按score,再按age降序)。
三、复杂对象的自定义排序
对于自定义类对象,可通过定义__lt__
(小于)方法或使用key
参数实现排序。
3.1 定义__lt__方法
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
def __lt__(self, other):
return self.score
3.2 使用key参数(无需修改类)
若不想修改类定义,可通过key
参数指定排序依据:
students = [
Student("Alice", 85),
Student("Bob", 92),
Student("Charlie", 78)
]
sorted_students = sorted(students, key=lambda x: x.score)
for student in sorted_students:
print(student.name, student.score)
四、实际应用案例
4.1 文件名按数字排序
处理文件名时,若需按数字部分排序(如file1.txt
, file2.txt
, file10.txt
),直接排序会得到错误结果。需提取数字部分排序:
import re
filenames = ["file1.txt", "file2.txt", "file10.txt", "file20.txt"]
def extract_number(filename):
return int(re.search(r'\d+', filename).group())
sorted_filenames = sorted(filenames, key=extract_number)
print(sorted_filenames) # 输出: ['file1.txt', 'file2.txt', 'file10.txt', 'file20.txt']
4.2 按日期排序
对包含日期的字符串列表排序,需将日期字符串转换为可比较的格式(如时间戳):
from datetime import datetime
dates = ["2023-01-15", "2022-12-01", "2023-03-20"]
sorted_dates = sorted(dates, key=lambda x: datetime.strptime(x, "%Y-%m-%d"))
print(sorted_dates) # 输出: ['2022-12-01', '2023-01-15', '2023-03-20']
4.3 忽略大小写排序
对字符串列表忽略大小写排序:
words = ["Apple", "banana", "Cherry", "date"]
sorted_words = sorted(words, key=lambda x: x.lower())
print(sorted_words) # 输出: ['Apple', 'banana', 'Cherry', 'date']
五、性能与注意事项
5.1 sorted()与list.sort()
sorted()
返回新列表,原列表不变;list.sort()
直接修改原列表,返回None
。
numbers = [3, 1, 4]
sorted_numbers = sorted(numbers) # 新列表
numbers.sort() # 原列表修改
print(numbers) # 输出: [1, 3, 4]
5.2 稳定性
Python的排序是稳定的,即相等元素的相对顺序不变。例如:
data = [("a", 1), ("b", 2), ("a", 3), ("c", 4)]
# 先按第一个元素排序,再按第二个元素排序
sorted_data = sorted(data, key=lambda x: x[1])
print(sorted_data)
# 输出: [('a', 1), ('b', 2), ('a', 3), ('c', 4)]
5.3 大数据排序
对大数据排序时,key
函数的效率至关重要。避免在key
中执行复杂计算,可预先计算并存储结果。
六、总结与扩展
sorted()
函数是Python中处理排序的利器,通过灵活使用key
和reverse
参数,可应对绝大多数排序需求。对于更复杂的场景(如多维排序、自定义比较逻辑),可结合functools.cmp_to_key
将传统比较函数转换为key
函数。
from functools import cmp_to_key
def compare(a, b):
if a % 2 == b % 2: # 奇偶性相同
return a - b # 按数值升序
elif a % 2 == 1: # a是奇数,b是偶数
return -1 # 奇数排在偶数前
else: # a是偶数,b是奇数
return 1
numbers = [1, 2, 3, 4, 5, 6]
sorted_numbers = sorted(numbers, key=cmp_to_key(compare))
print(sorted_numbers) # 输出: [1, 3, 5, 2, 4, 6]
关键词:Python、sorted函数、排序算法、key参数、lambda表达式、多级排序、稳定性、性能优化
简介:本文通过基础数字排序、字符串排序、对象属性排序等实例,详细讲解Python中sorted()函数的使用方法,涵盖key参数的高级技巧、多级排序、复杂对象排序及实际应用案例,并分析性能与注意事项。