python sorted排序函数

说明

Python列表有一个 list.sort() 方法可以直接修改原列表对象进行排序

Python还内置了一个 sorted() 函数对可迭代对象排序并返回新的列表对象

普通排序

特点:原列表的元素顺序不改变,返回一个新列表,新列表是重新排序的

sorted([5, 2, 3, 1, 4])

执行结果:

[1, 2, 3, 4, 5]

key参数

sorted() 函数有 key参数,key形参的值应该是一个函数,它接受一个参数并返回一个用于排序的键

students = [('李雷', 185),('韩梅梅', 160),('lucy', 172)]

def getKey(item):
    return item[1]

res = sorted(students, key=getKey)
# res = sorted(students, key=lambda student: student[2])
print(res)

执行结果:

[('韩梅梅', 160), ('lucy', 172), ('李雷', 185)]

reverse 倒序参数

reverse = True 表示倒序

a = [5, 2, 3, 1, 4]

res = sorted(a,reverse=True)
print(res)

执行结果:

[5, 4, 3, 2, 1]

自定义排序

提出问题

文件名如下:

files = ['10.py','20.py','2.py','1.py','3.py']

对文件名,按照数字的顺序进行排序,用上面的方法就无法实现

sorted(files)

执行结果:

['1.py', '10.py', '2.py', '20.py', '3.py']

10.py, 20.py应该排在后面

解决

使用自定义排序

代码

from functools import cmp_to_key

files = ['10.py','20.py','2.py','1.py','3.py']
# a是第二个元素,b是第一个元素
def cmp(a,b):
    # 截取文件名
    pos = a.rfind(".")
    a = a[:pos]

    pos = b.rfind(".")
    b = b[:pos]
    # 比较文件名长度
    if len(a) > len(b):
        return 1
    elif len(a) < len(b):
        return -1 # 交换位置
    else: # 长度相等时,比较数字大小
        ai = int(a)
        bi = int(b)
        if ai > bi:
            return 1
        elif ai < bi:
            return -1 # 交换位置
        else:
            return 0 # 表示相等


res = sorted(files,key = cmp_to_key(cmp))
print(res)

原文出处:/show_1IX7NMxHgwqW.html