python中必须掌握的20个核心函数——sorted()函数
itomcoil 2025-10-23 03:55 1 浏览
sorted()是Python的内置函数,用于对可迭代对象进行排序,返回一个新的排序后的列表,不修改原始对象。
一、sorted()的基本用法
1.1 方法签名
sorted(iterable, *, key=None, reverse=False)- iterable:可迭代对象(列表、元组、字符串、字典等)
- key:排序键函数(可选)
- reverse:是否反向排序(默认False,升序)
1.2 基础排序示例
# 数字排序
numbers = [3, 1, 4, 1, 5, 9, 2]
print(sorted(numbers)) # [1, 1, 2, 3, 4, 5, 9]
# 字符串排序(按字母顺序)
words = ["banana", "apple", "cherry"]
print(sorted(words)) # ['apple', 'banana', 'cherry']
# 反向排序
print(sorted(numbers, reverse=True)) # [9, 5, 4, 3, 2, 1, 1]1.3 与list.sort()的区别
numbers = [3, 1, 4, 1, 5]
# sorted() - 返回新列表,原列表不变
sorted_nums = sorted(numbers)
print(sorted_nums) # [1, 1, 3, 4, 5]
print(numbers) # [3, 1, 4, 1, 5](未改变)
# list.sort() - 原地排序,返回None
numbers.sort()
print(numbers) # [1, 1, 3, 4, 5](已修改)二、高级排序技巧
2.1 使用key参数进行自定义排序
# 按字符串长度排序
words = ["apple", "banana", "cherry", "date"]
print(sorted(words, key=len)) # ['date', 'apple', 'banana', 'cherry']
# 按第二个字符排序
print(sorted(words, key=lambda x: x[1])) # ['banana', 'date', 'apple', 'cherry']
# 按绝对值排序
numbers = [-5, 3, -1, 4, -2]
print(sorted(numbers, key=abs)) # [-1, -2, 3, 4, -5]2.2 多级排序
# 先按长度,再按字母顺序
words = ["apple", "banana", "cherry", "date", "fig"]
print(sorted(words, key=lambda x: (len(x), x)))
# ['fig', 'date', 'apple', 'banana', 'cherry']
# 学生数据:先按分数降序,再按姓名升序
students = [
{"name": "Alice", "score": 85},
{"name": "Bob", "score": 92},
{"name": "Charlie", "score": 85}
]
sorted_students = sorted(students, key=lambda x: (-x["score"], x["name"]))
print(sorted_students)
# [{'name': 'Bob', 'score': 92}, {'name': 'Alice', 'score': 85}, {'name': 'Charlie', 'score': 85}]2.3 使用attrgetter和itemgetter
from operator import itemgetter, attrgetter
# 对字典列表排序
data = [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 20}]
print(sorted(data, key=itemgetter("age"))) # 按age排序
# 对对象列表排序
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person({self.name}, {self.age})"
people = [Person("Alice", 25), Person("Bob", 20)]
print(sorted(people, key=attrgetter("age"))) # 按age属性排序三、实际应用场景
3.1 数据处理与分析
# 销售数据排序
sales = [
{"product": "A", "revenue": 1000},
{"product": "B", "revenue": 2500},
{"product": "C", "revenue": 1500}
]
# 按收入降序排序
top_sellers = sorted(sales, key=lambda x: x["revenue"], reverse=True)
print(top_sellers) # B, C, A3.2 文件内容排序
# 读取文件并排序
with open("data.txt") as f:
lines = sorted(f.readlines()) # 按字母顺序排序行
# 按数字排序文件内容
with open("numbers.txt") as f:
numbers = sorted([int(line.strip()) for line in f])3.3 复杂数据结构排序
# 嵌套列表排序
matrix = [[3, 2, 1], [6, 5, 4], [9, 8, 7]]
# 按每个子列表的第一个元素排序
sorted_matrix = sorted(matrix, key=lambda x: x[0])
print(sorted_matrix) # [[3, 2, 1], [6, 5, 4], [9, 8, 7]]四、性能考虑与优化
4.1 排序稳定性
# sorted()是稳定排序(相等元素的相对位置不变)
data = [
("apple", 2),
("banana", 1),
("cherry", 2),
("date", 1)
]
# 先按数字排序,再按字母排序(保持相同数字的原始顺序)
result = sorted(data, key=lambda x: x[0]) # 按字母排序
result = sorted(result, key=lambda x: x[1]) # 再按数字排序
print(result)
# [('banana', 1), ('date', 1), ('apple', 2), ('cherry', 2)]4.2 大型数据排序
# 使用生成器表达式节省内存
large_data = (x for x in range(1000000, 0, -1))
sorted_data = sorted(large_data) # 仍然需要内存存储结果
# 对于极大文件,考虑外部排序
def external_sort(file_path):
"""简单的外部排序示例"""
chunks = []
# 分块读取、排序、保存
# ...实现略...
return sorted_chunks五、常见问题解答
5.1 sorted()可以排序哪些对象?
任何可迭代对象,但元素必须支持比较操作:
# 数字和字符串可以排序
print(sorted([3, 1, 2])) # [1, 2, 3]
print(sorted(["c", "a", "b"])) # ["a", "b", "c"]
# 混合类型不能直接排序
try:
sorted([1, "a", 2])
except TypeError as e:
print(f"错误: {e}") # '<' not supported between instances of 'str' and 'int'5.2 如何实现降序排序?
numbers = [3, 1, 4, 1, 5]
# 方法1:使用reverse参数
print(sorted(numbers, reverse=True)) # [5, 4, 3, 1, 1]
# 方法2:使用负key(对于数字)
print(sorted(numbers, key=lambda x: -x)) # [5, 4, 3, 1, 1]5.3 排序时如何处理None值?
data = [3, None, 1, 4, None, 2]
# 方法1:过滤None值
print(sorted([x for x in data if x is not None])) # [1, 2, 3, 4]
# 方法2:自定义排序键
print(sorted(data, key=lambda x: float('inf') if x is None else x))
# [1, 2, 3, 4, None, None]六、高级技巧
6.1 使用functools.cmp_to_key
from functools import cmp_to_key
# 自定义比较函数(Python 2风格)
def custom_compare(a, b):
if len(a) != len(b):
return len(a) - len(b)
return (a > b) - (a < b)
words = ["apple", "banana", "cherry", "date"]
print(sorted(words, key=cmp_to_key(custom_compare)))
# ['date', 'apple', 'banana', 'cherry']6.2 处理时区感知的日期时间
from datetime import datetime
import pytz
dates = [
datetime(2023, 1, 1, tzinfo=pytz.UTC),
datetime(2023, 1, 1, tzinfo=pytz.timezone("US/Eastern"))
]
# 转换为UTC后排序
sorted_dates = sorted(dates, key=lambda x: x.astimezone(pytz.UTC))七、总结最佳实践
选择sorted()还是sort():
- 需要新列表 → sorted()
- 原地排序 → list.sort()
复杂排序使用key参数:
- 多级排序使用元组key
- 使用attrgetter/itemgetter提高可读性
性能考虑:
- 大型数据注意内存使用
- 考虑使用生成器表达式
错误处理:
- 确保元素可比较
- 处理None值等特殊情况
# 健壮的排序函数
def safe_sorted(iterable, **kwargs):
"""安全的排序函数,处理异常情况"""
try:
return sorted(iterable, **kwargs)
except TypeError:
# 处理不可比较的情况
return sorted(iterable, key=str, **kwargs) # 转为字符串比较
print(safe_sorted([1, "a", 2])) # [1, 2, 'a']sorted()是Python中最强大和灵活的函数之一,掌握它的各种用法能够极大地提高数据处理能力。
相关推荐
-
- Python编程实现求解高次方程_python求次幂
-
#头条创作挑战赛#编程求解一元多次方程,一般情况下对于高次方程我们只求出近似解,较少的情况可以得到精确解。这里给出两种经典的方法,一种是牛顿迭代法,它是求解方程根的有效方法,通过若干次迭代(重复执行部分代码,每次使变量的当前值被计算出的新值...
-
2025-10-23 03:58 itomcoil
- python常用得内置函数解析——sorted()函数
-
接下来我们详细解析Python中非常重要的内置函数sorted()1.函数定义sorted()函数用于对任何可迭代对象进行排序,并返回一个新的排序后的列表。语法:sorted(iterabl...
- Python入门学习教程:第 6 章 列表
-
6.1什么是列表?在Python中,列表(List)是一种用于存储多个元素的有序集合,它是最常用的数据结构之一。列表中的元素可以是不同的数据类型,如整数、字符串、浮点数,甚至可以是另一个列表。列...
- Python之函数进阶-函数加强(上)_python怎么用函数
-
一.递归函数递归是一种编程技术,其中函数调用自身以解决问题。递归函数需要有一个或多个终止条件,以防止无限递归。递归可以用于解决许多问题,例如排序、搜索、解析语法等。递归的优点是代码简洁、易于理解,并...
- Python内置函数range_python内置函数int的作用
-
range类型表示不可变的数字序列,通常用于在for循环中循环指定的次数。range(stop)range(start,stop[,step])range构造器的参数必须为整数(可以是内...
- python常用得内置函数解析——abs()函数
-
大家号这两天主要是几个常用得内置函数详解详细解析一下Python中非常常用的内置函数abs()。1.函数定义abs(x)是Python的一个内置函数,用于返回一个数的绝对值。参数:x...
- 如何在Python中获取数字的绝对值?
-
Python有两种获取数字绝对值的方法:内置abs()函数返回绝对值。math.fabs()函数还返回浮点绝对值。abs()函数获取绝对值内置abs()函数返回绝对值,要使用该函数,只需直接调用:a...
- 贪心算法变种及Python模板_贪心算法几个经典例子python
-
贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法策略。以下是贪心算法的主要变种、对应的模板和解决的问题特点。1.区间调度问题问题特点需要从一组区间中选择最大数...
- Python倒车请注意!负步长range的10个高能用法,让代码效率翻倍
-
你是否曾遇到过需要倒着处理数据的情况?面对时间序列、日志文件或者矩阵操作,传统的遍历方式往往捉襟见肘。今天我们就来揭秘Python中那个被低估的功能——range的负步长操作,让你的代码优雅反转!一、...
- Python中while循环详解_python怎么while循环
-
Python中的`while`循环是一种基于条件判断的重复执行结构,适用于不确定循环次数但明确终止条件的场景。以下是详细解析:---###一、基本语法```pythonwhile条件表达式:循环体...
- 简单的python-核心篇-面向对象编程
-
在Python中,类本身也是对象,这被称为"元类"。这种设计让Python的面向对象编程具有极大的灵活性。classMyClass:"""一个简单的...
- 简单的python-python3中的不变的元组
-
golang中没有内置的元组类型,但是多值返回的处理结果模拟了元组的味道。因此,在golang中"元组”只是一个将多个值(可能是同类型的,也可能是不同类型的)绑定在一起的一种便利方法,通常,也...
- python中必须掌握的20个核心函数——sorted()函数
-
sorted()是Python的内置函数,用于对可迭代对象进行排序,返回一个新的排序后的列表,不修改原始对象。一、sorted()的基本用法1.1方法签名sorted(iterable,*,ke...
- 12 个 Python 高级技巧,让你的代码瞬间清晰、高效
-
在日常的编程工作中,我们常常追求代码的精简、优雅和高效。你可能已经熟练掌握了列表推导式(listcomprehensions)、f-string和枚举(enumerate)等常用技巧,但有时仍会觉...
- Python的10个进阶技巧:写出更快、更省内存、更优雅的代码
-
在Python的世界里,我们总是在追求效率和可读性的完美平衡。你不需要一个数百行的新框架来让你的代码变得优雅而快速。事实上,真正能带来巨大提升的,往往是那些看似微小、却拥有高杠杆作用的技巧。这些技巧能...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)
