目录
python 列表字符串自定义排序:
import functools
def compare_personal(x,y):
if int(x)>int(y):
return 1
else:
return -1
if __name__ == '__main__':
aaa=['21','2','3','1']
aaa.sort(key=functools.cmp_to_key(compare_personal))
print(aaa)
Python3中移除了cmp内建函数,sorted函数也没有了cmp这个关键字参数,但可以通过functools模块中的cmp_to_key来对自定义的cmp函数进行包装,然后就能赋值给sorted函数的关键字参数key,来间接实现Python2中cmp函数用于排序的效果。
cmp_to_key使用例子
import functools
x=[1,3,2,4,5]
def cmp_rise(a,b):
'''
升序排序:
'''
if a <b:
return -1
else:
return 1
def cmp_decline(a,b):
'''
降序排序:
'''
if a <b:
return 1
else:
return -1
x_sorted_by_rise=sorted(x,key=functools.cmp_to_key(cmp_rise))
x_sorted_by_decline=sorted(x,key=functools.cmp_to_key(cmp_decline))
print(x) # 输出结果:[1, 3, 2, 4, 5]
print(x_sorted_by_rise) # 输出结果:[1, 2, 3, 4, 5]
print(x_sorted_by_decline) # 输出结果:[5, 4, 3, 2, 1]
列表自定义多字段排序
再来看一下多字段排序,这个例子中要依次根据学生的成绩、年龄、姓名来进行多级排序,其中成绩是升序,年龄是降序,姓名是升序。
import functools
persons=[
{
'name': 'lisi',
'age': 18,
'grade': 88
},
{
'name': 'nisi',
'age': 20,
'grade': 77
},
{
'name':'zhangsan',
'age':20,
'grade':98
},
{
'name': 'wangwu',
'age': 20,
'grade': 20
},
{
'name': 'yangqing',
'age': 15,
'grade': 20
},
{
'name': 'mike',
'age': 22,
'grade': 20
}
]
def cmp(a,b):
if a['grade']>b['grade']:
return 1 # 前面的a的grade大于后面的b的grade则返回1,代表交换顺序
elif a['grade']<b['grade']:
return -1 # 前面的a的grade小于后面的b的grade则返回-1,代表保持不变,因此对grade升序排序。
elif a['age']>b['age']:
return -1 # grade相等的情况下看age,前面的a的age大于后面的b的age则返回-1,代表保持不变,
elif a['age']<b['age']:
return 1 # 前面的a的age小于后面的b的age则返回1,代表交换顺序,因此对age降序排序。
elif a['name']>b['name']:
return 1 # 在grade和age都相等的情况下,比较name,很明显这里是对name升序排序。
else:
return -1
# 输出未排序之前的列表
print(persons)
persons_new=sorted(persons,key=functools.cmp_to_key(cmp))
print(persons_new)
灵感来源:https://blog.csdn.net/weixin_30362233/article/details/99893873
————————————————
版权声明:本文为CSDN博主「life_forwin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/life_forwin/article/details/115066143