当前位置:   article > 正文

Python排序方式_class a(str): def __lt__(x, y):

class a(str): def __lt__(x, y):

Python排序

  1. 多属性排序
  2. 自定义规则排序

开篇先介绍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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
运行结果:
    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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
运行结果:
['A', 'Tom', 'egg', 'Rose', 'join', 'study', 'friend'] 

['A', 'egg', 'friend', 'join', 'Rose', 'study', 'Tom'] 

['A', 'egg', 'Tom', 'join', 'Rose', 'study', 'friend'] 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

下面我们再来一个例子,苏老师要管理本班学生的身高与体重,便让班长去收集本班学生信息,同时又给他提出了要求,将学生的身高按照大小顺序排序,若身高相同则按照体重排序,是不是与上例的第三种情况相同。你可以做出来吗?下面上代码。

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)
  • 1
  • 2
  • 3
  • 4

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
运行结果:
['9', '5', '34', '3', '30']
  • 1
  • 2

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
运行结果:
['9', '5', '34', '3', '30']
  • 1
  • 2

官方文档:官方排序文档

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/177680
推荐阅读
相关标签
  

闽ICP备14008679号