python3 list 自定义排序

本文详细介绍了Python2和Python3中自定义排序的方法。在Python2中,通过cmp函数实现,而在Python3中则使用functools.cmp_to_key转换cmp函数为key参数。文章提供了具体示例,展示了如何根据元素的多个属性进行排序。

python3 list 自定义排序

python2 自定义排序

在python2中,我们可以使用cmp进行自定义排序,当时在python3中却取消了这个参数。

def cmp(x1, x2):
	...

a.sort(cmp)

python3 自定义排序

参考 Masker的做法,可以使用以下方式进行自定义排序。

def cmp(x1, x2):
	if x1['score'] != x2['score']: # 如果score不同
		return x1['score'] < x2['score'] # 那么小的在前面
	else: # 如果score相同
		return x1['name'] < x2['name']	# 那么名字字典序小的在前面
# 注意这里默认score和name不会同时相同

import functools
a.sort(key=functools.cmp_to_key(cmp))

Python 中,可以通过 `sorted()` 函数或列表的 `sort()` 方法结合 `key` 参数和 `lambda` 表达式实现自定义排序。这种技术特别适用于对复杂数据结构进行排序。 ### 使用 `sorted()` 和 `lambda` 进行升序排序 `sorted()` 函数会返回一个新的排序后的列表,原始列表保持不变。通过 `key` 参数指定一个函数,该函数用于从每个元素中提取排序依据。 例如,假设有一个字符串列表 `chars = [&#39;a&#39;, &#39;is&#39;, &#39;boy&#39;, &#39;bruce&#39;, &#39;handsome&#39;]`,可以根据字符串长度进行排序: ```python sorted_chars = sorted(chars, key=lambda x: len(x)) # 输出:[&#39;a&#39;, &#39;is&#39;, &#39;boy&#39;, &#39;bruce&#39;, &#39;handsome&#39;] ``` 如果希望按长度降序排列,可以设置参数 `reverse=True`: ```python sorted_chars_desc = sorted(chars, key=lambda x: len(x), reverse=True) # 输出:[&#39;handsome&#39;, &#39;bruce&#39;, &#39;boy&#39;, &#39;is&#39;, &#39;a&#39;] ``` ### 使用 `list.sort()` 进行原地排序 对于列表对象本身,可以直接调用 `.sort()` 方法来进行排序,并且这一操作会直接修改原列表。 例如,对包含元组的列表按照元组的第一个元素进行排序: ```python data = [(1, &#39;apple&#39;), (3, &#39;banana&#39;), (2, &#39;cherry&#39;)] data.sort(key=lambda x: x[0]) # 输出:[(1, &#39;apple&#39;), (2, &#39;cherry&#39;), (3, &#39;banana&#39;)] ``` ### 多级排序 当需要根据多个条件进行排序时,可以在 `lambda` 表达式中返回一个元组,元组中的每个元素对应一个排序条件。 例如,先根据元组的第一个元素升序排列,然后根据第二个元素降序排列: ```python data = [(1, &#39;c&#39;), (2, &#39;a&#39;), (1, &#39;b&#39;)] data.sort(key=lambda x: (x[0], -ord(x[1]))) # 输出:[(1, &#39;c&#39;), (1, &#39;b&#39;), (2, &#39;a&#39;)] ``` ### 自定义比较函数(Python 3 中使用 `functools.cmp_to_key`) 在某些情况下,可能需要更复杂的比较逻辑,这时可以使用 `functools.cmp_to_key` 将一个比较函数转换为 `key` 函数。 例如,根据元组的第二个元素进行逆序排序: ```python from functools import cmp_to_key def custom_sort(x, y): return y[1] - x[1] data = [(1, 3), (2, 1), (3, 2)] data.sort(key=cmp_to_key(custom_sort)) # 输出:[(1, 3), (3, 2), (2, 1)] ``` ### 示例代码总结 以下是一个完整的示例,展示如何使用 `lambda` 表达式对列表进行排序: ```python chars = [&#39;a&#39;, &#39;is&#39;, &#39;boy&#39;, &#39;bruce&#39;, &#39;handsome&#39;] # 按照字符串长度升序排序 sorted_chars_asc = sorted(chars, key=lambda x: len(x)) print(sorted_chars_asc) # 输出:[&#39;a&#39;, &#39;is&#39;, &#39;boy&#39;, &#39;bruce&#39;, &#39;handsome&#39;] # 按照字符串长度降序排序 sorted_chars_desc = sorted(chars, key=lambda x: len(x), reverse=True) print(sorted_chars_desc) # 输出:[&#39;handsome&#39;, &#39;bruce&#39;, &#39;boy&#39;, &#39;is&#39;, &#39;a&#39;] # 原列表排序 data = [(1, &#39;c&#39;), (2, &#39;a&#39;), (1, &#39;b&#39;)] data.sort(key=lambda x: (x[0], -ord(x[1]))) print(data) # 输出:[(1, &#39;c&#39;), (1, &#39;b&#39;), (2, &#39;a&#39;)] # 自定义比较函数 from functools import cmp_to_key def custom_sort(x, y): return y[1] - x[1] data_custom = [(1, 3), (2, 1), (3, 2)] data_custom.sort(key=cmp_to_key(custom_sort)) print(data_custom) # 输出:[(1, 3), (3, 2), (2, 1)] ``` 通过这些方法,可以灵活地实现基于特定规则的排序需求[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值