百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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, A

3.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求次幂
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的世界里,我们总是在追求效率和可读性的完美平衡。你不需要一个数百行的新框架来让你的代码变得优雅而快速。事实上,真正能带来巨大提升的,往往是那些看似微小、却拥有高杠杆作用的技巧。这些技巧能...