Python 中 list.sort() 是列表中非常常用的排序函数, key 参数可以对单个属性进行排序。 但是想要实现类似 sql 中 order by id, age 一样,对多个字段进行排序就不支持了。 py2 中 sort() 函数还有个 cmp 参数可以传入一个方法,可以自定义对多个属性进行排序,py3 中移除了这个字段。 py3 想要实现这个功能,需要使用 functools 模块中的方法,实例如下 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author: wxnacy(wxnacy@gmail.com) from funct 在Python编程中,排序操作是常见的任务之一,特别是在处理数据集合时。`list.sort()`方法是内置的排序功能,允许用户对列表中的元素进行排序。然而,当需要根据多个属性或字段进行排序时,标准的`key`参数就无法满足需求了。在Python 2中,`sort()`函数还有一个`cmp`参数,可以通过自定义比较函数来实现复杂的排序逻辑。但在Python 3中,`cmp`参数被移除,取而代之的是使用`functools`模块中的`cmp_to_key()`函数来达到相同目的。 `functools`模块是Python的一个标准库,提供了许多高级函数工具,其中`cmp_to_key()`函数将比较函数转换为键函数,这样就可以与`key`参数一起使用。下面我们将详细介绍如何使用`functools`来实现多属性排序。 我们需要定义一个比较函数`cmp_func`,这个函数接受两个元素作为参数(通常是字典或其他包含多个属性的对象),并根据指定的顺序返回-1、0或1,表示第一个元素小于、等于或大于第二个元素。例如: ```python def cmp_func(a, b): if a['id'] < b['id']: return -1 elif a['id'] > b['id']: return 1 if a['name'] < b['name']: return -1 elif a['name'] > b['name']: return 1 return 0 ``` 在这个例子中,我们首先按照'id'字段进行正序排序,如果'id'相同,则按照'name'字段进行正序排序。然后,我们可以将这个比较函数转换为键函数,通过`cmp_to_key()`,并将结果作为`key`参数传递给`sort()`方法: ```python from functools import cmp_to_key arr.sort(key=cmp_to_key(cmp_func)) ``` 这样,列表`arr`就会按照我们定义的规则进行排序。 为了使代码更易于复用,可以将这个过程封装成一个通用的函数,如下所示: ```python def sort_by_multi_fields(lst, *fields): def multi_cmp(a, b): for field in fields: if a[field] < b[field]: return -1 elif a[field] > b[field]: return 1 return 0 lst.sort(key=cmp_to_key(multi_cmp)) ``` 这个`sort_by_multi_fields`函数接受一个列表`lst`以及任意数量的字段名`fields`,并按照这些字段依次进行排序。这样,我们就可以轻松地对具有多个属性的数据进行排序,而无需每次都编写新的比较函数。 总结来说,Python 3中对多属性排序的支持主要依赖于`functools`模块的`cmp_to_key()`函数。通过定义一个比较函数,然后将其转换为键函数,可以实现类似SQL的`ORDER BY`语句的效果,对多个字段进行排序。这使得我们在处理复杂数据结构时具有更高的灵活性和控制力。如果你需要对列表中的元素进行多条件排序,可以参考上述方法,创建自己的比较函数,并使用`functools`来进行实现。
- 粉丝: 0
- 资源: 938
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
评论0