1 list.sort

list.sort(key=None, reverse=False)

该方法只能用于list。就地排序,原来的list被修改。key的用法见下文。reverse控制降序还是生序,默认是升序(key为None的前提下。如果key指定了顺序,则reverse=True时采取相反顺序)

print(a)
a.sort()
print(a)
a.sort(reverse=True)
print(a)

输出如下:
[4, 6, 1, 234, 87]
[1, 4, 6, 87, 234]
[234, 87, 6, 4, 1]

2 sorted()

sorted(iterable, *, key=None, reverse=False)

该方法适用于一切可迭代的对象。返回一个新的排好序的列表。该排序是稳定排序。

a = [4, 6, 1, 234, 87]
print(a)
print(sorted(a))

输出
[4, 6, 1, 234, 87]
[1, 4, 6, 87, 234]

3 key

现在详细说下参数key
key必须是个函数,且是接受一个参数的函数。返回key,作为排序时的比较对象。
比如:key=str.lower
下面这个对元组排序

student_tuples = [
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
]
print(sorted(student_tuples, key=lambda student: student[2]) )

根据元组中第3个元素进行比较,结果是:
[(‘dave’, ‘B’, 10), (‘jane’, ‘B’, 12), (‘john’, ‘A’, 15)]

对类对象的排序

class Student:
    def __init__(self, name, grade, age):
        self.name = name
        self.grade = grade
        self.age = age
    def __repr__(self):
        return repr((self.name, self.grade, self.age))

student_objects = [
    Student('john', 'A', 15),
    Student('jane', 'B', 12),
    Student('dave', 'B', 10),
]

print(sorted(student_objects, key=lambda student: student.age))

结果: [(‘dave’, ‘B’, 10), (‘jane’, ‘B’, 12), (‘john’, ‘A’, 15)]

4 operator 提供的便捷方法

改写上面的例子

from operator import itemgetter, attrgetter
sorted(student_tuples, key=itemgetter(2))
sorted(student_objects, key=attrgetter('age'))

根据多个值排序(比如先根据成绩排序,成绩一样的再根据年龄排序)

sorted(student_tuples, key=itemgetter(1,2))
sorted(student_objects, key=attrgetter('grade', 'age'))

最后一个例子:

students = ['dave', 'john', 'jane']
newgrades = {'john': 'F', 'jane':'A', 'dave': 'C'}
print(sorted(students, key=newgrades.__getitem__))

结果: [‘jane’, ‘dave’, ‘john’]

版权声明:本文为vdvvdd原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/vdvvdd/p/10455829.html