Python3 自定义排序详解:方法与示例

简介: Python的排序功能强大且灵活,主要通过`sorted()`函数和列表的`sort()`方法实现。两者均支持`key`参数自定义排序规则。本文详细介绍了基础排序、按字符串长度或元组元素排序、降序排序、多条件排序及使用`lambda`表达式和`functools.cmp_to_key`进行复杂排序。通过示例展示了如何对简单数据类型、字典、类对象及复杂数据结构(如列车信息)进行排序。掌握这些技巧可以显著提升数据处理能力,为编程提供更强大的支持。

在Python编程中,排序是一项常见的操作。Python提供了强大的排序功能,通过sorted()函数和列表的sort()方法,可以方便地对列表进行排序。这两个方法都支持key参数,允许开发者自定义排序规则。本文将通过详细的方法和示例,讲解如何在Python3中实现自定义排序。
站大爷代理IP工具的验证功能介绍 (31).png

一、基础排序
Python的sorted()函数返回一个新的列表,而列表的sort()方法则直接对原列表进行排序,不返回任何值(返回值为None)。

基础示例

numbers = [5, 2, 9, 1, 5, 6]
sorted_numbers = sorted(numbers)
print(sorted_numbers) # 输出: [1, 2, 5, 5, 6, 9]
使用sort()方法:

python
numbers = [5, 2, 9, 1, 5, 6]
numbers.sort()
print(numbers) # 输出: [1, 2, 5, 5, 6, 9]

二、自定义排序规则
通过key参数,可以自定义排序规则。key参数接收一个函数,该函数会接收列表中的每一个元素作为参数,并返回一个值作为该元素的排序优先级。

2.1 按字符串长度排序

words = ["apple", "banana", "cherry", "date"]
sorted_words = sorted(words, key=len)
print(sorted_words) # 输出: ['date', 'apple', 'banana', 'cherry']

2.2 按元组的第二个元素排序

pairs = [(1, 3), (4, 1), (2, 5), (3, 2)]
sorted_pairs = sorted(pairs, key=lambda x: x[1])
print(sorted_pairs) # 输出: [(4, 1), (3, 2), (1, 3), (2, 5)]

2.3 降序排序
通过reverse=True参数,可以实现降序排序。

numbers = [5, 2, 9, 1, 5, 6]
sorted_numbers_desc = sorted(numbers, reverse=True)
print(sorted_numbers_desc) # 输出: [9, 6, 5, 5, 2, 1]

使用sort()方法时也可以指定reverse=True:

numbers = [5, 2, 9, 1, 5, 6]
numbers.sort(reverse=True)
print(numbers) # 输出: [9, 6, 5, 5, 2, 1]

2.4 多条件排序
有时需要根据多个条件进行排序,例如先按一个字段排序,再按另一个字段排序。

people = [('Alice', 25), ('Bob', 30), ('Alice', 22)]
sorted_people = sorted(people, key=lambda x: (x[0], x[1]))
print(sorted_people) # 输出: [('Alice', 22), ('Alice', 25), ('Bob', 30)]

三、使用lambda表达式定义复杂排序规则
lambda表达式可以用于定义更复杂的排序规则。

3.1 按字典值排序

people = {"Alice": 30, "Bob": 25, "Charlie": 35}
sorted_people = sorted(people.items(), key=lambda x: x[1])
print(sorted_people) # 输出: [('Bob', 25), ('Alice', 30), ('Charlie', 35)]

3.2 对类对象排序

可以创建一个类,并根据类的属性对对象进行排序。

class Person:
def init(self, name, age):
self.name = name
self.age = age

def __repr__(self):
    return f"Person{name=self.name, age=self.age}"

创建Person对象

people = [Person("Alice", 30), Person("Bob", 25), Person("Charlie", 35)]

按年龄排序

sorted_people = sorted(people, key=lambda person: person.age)
for person in sorted_people:
print(person)

输出: Person{name='Bob', age=25}, Person{name='Alice', age=30}, Person{name='Charlie', age=35}

四、使用functools.cmp_to_key进行传统比较
当需要使用传统的比较函数(cmp函数)时,可以使用functools.cmp_to_key进行转换。

from functools import cmp_to_key

自定义比较函数

def compare(a, b):
if a % 2 == b % 2:
return a - b # 相同类型(奇偶性)按大小排序
return -1 if a % 2 == 0 else 1 # 偶数优先

numbers = [1, 2, 3, 4, 5, 6, 7, 8]
sorted_numbers = sorted(numbers, key=cmp_to_key(compare))
print(sorted_numbers) # 输出: [2, 4, 6, 8, 1, 3, 5, 7]

五、复杂数据结构排序示例
假设有一个包含列车信息的列表,需要根据“二等座”是否有票以及“历时”进行排序。

tickets = [
{'车次': 'G1', '历时': "1:23", '二等座': "有"},
{'车次': 'G2', '历时': "1:00", '二等座': "有"},
{'车次': 'G3', '历时': "0:23", '二等座': "13"},
{'车次': 'G4', '历时': "1:55", '二等座': "44"},
{'车次': 'G5', '历时': "0:21", '二等座': "13"},
{'车次': 'G6', '历时': "1:55", '二等座': "44"}
]

定义比较函数

def cmp_seat(t1, t2):
if t1["二等座"] == "有":
if t2["二等座"] == "有":
return 0
else:
return -1
else:
if t2["二等座"] == "有":
return 1
else:
return int(t2["二等座"]) - int(t1["二等座"])

def cmp_time(t1, t2):
hs1 = t1["历时"].split(":")
hs2 = t2["历时"].split(":")
tm1 = int(hs1[0]) 60 + int(hs1[1])
tm2 = int(hs2[0])
60 + int(hs2[1])
return tm1 - tm2

def cmp(t1, t2):
if cmp_seat(t1, t2) != 0:
return cmp_seat(t1, t2)
else:
return cmp_time(t1, t2)

使用cmp_to_key进行排序

tickets.sort(key=cmp_to_key(cmp))
for ticket in tickets:
print(ticket)

在这个例子中,cmp_seat函数用于比较“二等座”是否有票,cmp_time函数用于比较“历时”,cmp函数则综合这两个条件进行比较。最终通过tickets.sort(key=cmp_to_key(cmp))实现排序。

六、总结
Python的自定义排序功能非常强大,通过key参数和functools.cmp_to_key,可以灵活地定义排序规则。无论是简单的数据类型(如整数和字符串),还是复杂的对象,都可以轻松实现自定义排序。掌握自定义排序,可以大大增强对数据的处理能力,为数据分析和处理提供更强大的支持。

通过本文的示例,希望读者能够深刻理解Python自定义排序的用法,并在实际编程中灵活运用。自定义排序不仅限于上述示例,开发者可以根据实际需求,设计出更加复杂和高效的排序规则。

目录
相关文章
|
12天前
|
JSON 数据可视化 API
Python 中调用 DeepSeek-R1 API的方法介绍,图文教程
本教程详细介绍了如何使用 Python 调用 DeepSeek 的 R1 大模型 API,适合编程新手。首先登录 DeepSeek 控制台获取 API Key,安装 Python 和 requests 库后,编写基础调用代码并运行。文末包含常见问题解答和更简单的可视化调用方法,建议收藏备用。 原文链接:[如何使用 Python 调用 DeepSeek-R1 API?](https://apifox.com/apiskills/how-to-call-the-deepseek-r1-api-using-python/)
|
29天前
|
人工智能 自然语言处理 算法
随机的暴力美学蒙特卡洛方法 | python小知识
蒙特卡洛方法是一种基于随机采样的计算算法,广泛应用于物理学、金融、工程等领域。它通过重复随机采样来解决复杂问题,尤其适用于难以用解析方法求解的情况。该方法起源于二战期间的曼哈顿计划,由斯坦尼斯拉夫·乌拉姆等人提出。核心思想是通过大量随机样本来近似真实结果,如估算π值的经典示例。蒙特卡洛树搜索(MCTS)是其高级应用,常用于游戏AI和决策优化。Python中可通过简单代码实现蒙特卡洛方法,展示其在文本生成等领域的潜力。随着计算能力提升,蒙特卡洛方法的应用范围不断扩大,成为处理不确定性和复杂系统的重要工具。
69 21
|
2月前
|
安全
Python-打印99乘法表的两种方法
本文详细介绍了两种实现99乘法表的方法:使用`while`循环和`for`循环。每种方法都包括了步骤解析、代码演示及优缺点分析。文章旨在帮助编程初学者理解和掌握循环结构的应用,内容通俗易懂,适合编程新手阅读。博主表示欢迎读者反馈,共同进步。
|
2月前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
108 8
|
6月前
|
SQL JSON C语言
Python中字符串的三种定义方法
Python中字符串的三种定义方法
150 2
|
8月前
|
Python
python之字符串定义、切片、连接、重复、遍历、字符串方法
python之字符串定义、切片、连接、重复、遍历、字符串方法
python之字符串定义、切片、连接、重复、遍历、字符串方法
28.从入门到精通:Python3 面向对象 面向对象技术简介 类定义 类对象 类的方法
28.从入门到精通:Python3 面向对象 面向对象技术简介 类定义 类对象 类的方法
|
Python
Python面向对象、类的抽象、类的定义、类名遵循大驼峰的命名规范创建对象、类外部添加和获取对象属性、类内部操作属性魔法方法__init__()__str__()__del__()__repr__()
面向对象和面向过程,是两种编程思想. 编程思想是指对待同一个问题,解决问题的套路方式.面向过程: 注重的过程,实现的细节.亲力亲为.面向对象: 关注的是结果, 偷懒.类和对象,是面向对象中非常重要的两个概念object 是所有的类基类,即最初始的类class 类名(object): 类中的代码PEP8代码规范:类定义的前后,需要两个空行 创建的对象地址值都不一样如dog和dog1的地址就不一样,dog的地址为2378043254528dog1的地址为2378044849840 8.类内部操作属性 sel
287 1
Python面向对象、类的抽象、类的定义、类名遵循大驼峰的命名规范创建对象、类外部添加和获取对象属性、类内部操作属性魔法方法__init__()__str__()__del__()__repr__()
|
2月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!

热门文章

最新文章