详解Python3中的自定义排序

 更新时间:2025年01月24日 08:17:29   作者:傻啦嘿哟  
在Python编程中,排序是一项常见的操作,Python提供了强大的排序功能,本文将通过详细的方法和示例讲解如何在Python3中实现自定义排序,需要的可以了解下

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

一、基础排序

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自定义排序的用法,并在实际编程中灵活运用。自定义排序不仅限于上述示例,开发者可以根据实际需求,设计出更加复杂和高效的排序规则。

到此这篇关于详解Python3中的自定义排序的文章就介绍到这了,更多相关Python3自定义排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python中的tkinter库弹窗messagebox详解

    python中的tkinter库弹窗messagebox详解

    这篇文章主要介绍了python中的tkinter库弹窗messagebox,包括消息提示框、消息警告框、错误消息框,通过代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-06-06
  • Python+selenium实现趣头条的视频自动上传与发布

    Python+selenium实现趣头条的视频自动上传与发布

    本文主要介绍了通过Python+selenium实现趣头条的短视频自动上传与发布功能,同时支持抖音、快手、b站、小红书等平台的视频自动化同步发布。需要的朋友可以参考一下
    2021-12-12
  • python中telnetlib模块的使用方式

    python中telnetlib模块的使用方式

    这篇文章主要介绍了python中telnetlib模块的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Python图像处理二值化方法实例汇总

    Python图像处理二值化方法实例汇总

    这篇文章主要介绍了Python图像处理二值化方法实例汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • PyQt实现计数器的方法示例

    PyQt实现计数器的方法示例

    这篇文章主要介绍了PyQt实现计数器的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 详解Python中的四种队列

    详解Python中的四种队列

    队列是一种只允许在一端进行插入操作,而在另一端进行删除操作的线性表。这篇文章主要介绍了Python中的四种队列,需要的朋友可以参考下
    2018-05-05
  • Pycharm学习教程(1) 定制外观

    Pycharm学习教程(1) 定制外观

    这篇文章主要介绍了最全的Pycharm学习教程第一篇如何定制外观,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • python subprocess执行外部命令常用方法详细举例

    python subprocess执行外部命令常用方法详细举例

    这篇文章主要给大家介绍了关于python subprocess执行外部命令常用方法的相关资料,Python的subprocess模块提供了一种在Python中调用外部命令的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 关于Python常用模块时间模块time

    关于Python常用模块时间模块time

    这篇文章主要介绍了关于Python常用模块时间模块time,这个模块是Python自带的,我们不需要去下载,直接导入就可以使用,需要的朋友可以参考下
    2023-04-04
  • Python学习笔记之文件的读写操作实例分析

    Python学习笔记之文件的读写操作实例分析

    这篇文章主要介绍了Python学习笔记之文件的读写操作,结合实例形式详细分析了Python常见的文件读写操作实现技巧及相关注意事项,需要的朋友可以参考下
    2019-08-08

最新评论