赞
踩
开篇先介绍Python的两个排序函数:sort() 和 sorted(),其中前者是类成员函数,后者是Python语言的内置函数;两者的返回值不同。它们都包含 key 和 reverse 两个参数,key 参数定义了排序规则,reverse 参数定义排序方式(正序-False 或者 逆序-True),默认情况下 reverse = False。(key 在下面介绍)
if __name__ == '__main__':
nums_1 = [3,6,2,7,1,4,0]
nums_2 = [5,2,3,7,8,1,9]
# sort()
r_1 = nums_1.sort()
print('sort()函数返回值:',r_1)
print('sort()运行后原列表:',nums_1,'\n')
# sorted()
r_2 = sorted(nums_2)
print('sorted()函数返回值:', r_2)
print('sorted()运行后原列表:', nums_2, '\n')
# reverse参数
nums_1.sort(reverse = True)
print(nums_1)
运行结果:
sort()函数返回值: None
sort()运行后原列表: [0, 1, 2, 3, 4, 6, 7]
sorted()函数返回值: [1, 2, 3, 5, 7, 8, 9]
sorted()运行后原列表: [5, 2, 3, 7, 8, 1, 9]
[7, 6, 4, 3, 2, 1, 0]
1-根据属性排序
现在有一个字符串数组,如何根据字符串的长度进行排序?你可以自己编写一段程序实现吗?如果你成功了,那么现在你在考虑如何根据字母小写方式排序?那如果两者结合在一起呢?自己使用代码实现是不是很复杂。
if __name__ == '__main__':
string_1 = ['Tom','Rose','join','study','A','egg','friend']
string_2 = ['Tom','Rose','join','study','A','egg','friend']
string_3 = ['Tom','Rose','join','study','A','egg','friend']
# 根据长度进行排序
string_1.sort(key = len)
print(string_1,'\n')
# 根据小写字母进行排序
string_2.sort(key = str.lower)
print(string_2,'\n')
# 先比较长度,若长度相同,则根据小写字母排序
string_3.sort(key = lambda x : (len(x),str.lower(x)))
print(string_3,'\n')
运行结果:
['A', 'Tom', 'egg', 'Rose', 'join', 'study', 'friend']
['A', 'egg', 'friend', 'join', 'Rose', 'study', 'Tom']
['A', 'egg', 'Tom', 'join', 'Rose', 'study', 'friend']
下面我们再来一个例子,苏老师要管理本班学生的身高与体重,便让班长去收集本班学生信息,同时又给他提出了要求,将学生的身高按照大小顺序排序,若身高相同则按照体重排序,是不是与上例的第三种情况相同。你可以做出来吗?下面上代码。
if __name__ == '__main__':
data = [[165,60],[180,74],[169,64],[165,64],[177,80],[130,40],[165,56],[188,90]]
data.sort(key = lambda x : [x[0],[x[1]]])
print(data)
2-自定义规则排序
给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。
输入: [3,30,34,5,9]
输出: 9534330
例子来源:力扣_179(最大数)
解决思路:元素 x ,y 满足 x + y >= y + x,让 x 排在 y 前面。
1、class类实现
# 用户自定义类
class LargerNumKey(str):
def __lt__(x, y):
return x + y >= y + x
if __name__ == '__main__':
string = ['3','30','34','5','9']
string.sort(key = LargerNumKey)
print(string)
运行结果:
['9', '5', '34', '3', '30']
2、functools库中的cmp_to_key接口实现
#导入该模块
from functools import cmp_to_key
#自定义比较函数
def cmp(x,y):
if x + y > y + x:
return -1
elif x + y == y + x:
return 0
else:
return 1
if __name__ == '__main__':
string = ['3','30','34','5','9']
string.sort(key = cmp_to_key(cmp))
print(string)
运行结果:
['9', '5', '34', '3', '30']
官方文档:官方排序文档
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。