python 列表排序

说明

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

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

普通排序

特点:原列表的元素顺序改变

a = [5, 2, 3, 1, 4]
a.sort()

执行结果:

[1, 2, 3, 4, 5]

key参数

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

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

def getKey(item):
    return item[1]

students.sort(key = getKey)
print(students)

reverse 倒序参数

reverse = True 表示倒序

a = [5, 2, 3, 1, 4]
a.sort(reverse = True)
print(a)

执行结果:

[5, 4, 3, 2, 1]

自定义排序

提出问题

文件名如下:

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

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

files.sort()

执行结果:

['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 # 表示相等

# files.sort()
files.sort(key = cmp_to_key(cmp))
print(files)

参考:
https://zhuanlan.zhihu.com/p/67322333
https://blog.csdn.net/gongjianbo1992/article/details/107324871
https://zhuanlan.zhihu.com/p/378259530


原文出处:/show_1IX7NMnEH9kx.html