python排序

python3排序

  • 基本排序
  • 自定义cmp排序
  • 关键字排序
  • 升序降序与稳定排序

基本排序

Python 列表有一个内置的 list.sort() 方法可以直接修改列表。
还有一个 sorted() 内置函数,它会从一个可迭代对象构建一个新的排序列表。
list.sort() 方法只是为列表定义的,而 sorted() 函数可以接受任何可迭代对象。
排序结果默认是升序

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

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

自定义cmp排序

需要使用 functools.cmp_to_key() 函数

from functools import cmp_to_key

# 降序
def cmp_sort(worker1, worker2):
    if worker1.age != worker2.age:
        return 1 if worker1.age < worker2.age else -1
    if worker1.salary != worker2.salary:
        return 1 if worker1.salary < worker2.salary else -1
    if worker1.level != worker2.level:
        return 1 if worker1.level < worker2.level else -1

class Worker:
    def __init__(self, age, salary, level):
        self.age = age # 年龄
        self.salary = salary # 工资
        self.level = level # 职称

    def __str__(self):
        return 'age=' + str(self.age) + ',' + 'salary=' + str(self.salary) + ',' + 'level=' + str(self.level)

worker_list = [Worker(80, 7000, 8), Worker(80, 8000, 8), Worker(40, 5000, 9), Worker(30, 5000, 5), Worker(30, 6000, 5),
               Worker(30, 6000, 6)]

worker_list.sort(key=cmp_to_key(cmp_sort))
for worker in worker_list:
    print(worker)

# age=80,salary=8000,level=8
# age=80,salary=7000,level=8
# age=40,salary=5000,level=9
# age=30,salary=6000,level=6
# age=30,salary=6000,level=5
# age=30,salary=5000,level=5

关键字排序

list.sort() 和 sorted() 都有一个 key 形参用来指定在进行比较前要在每个列表元素上调用的函数(或其他可调用对象)。
常结合lambda表达式

from functools import cmp_to_key

class Worker:
    def __init__(self, age, salary, level):
        self.age = age
        self.salary = salary
        self.level = level

    def __str__(self):
        return 'age=' + str(self.age) + ',' + 'salary=' + str(self.salary) + ',' + 'level=' + str(self.level)

worker_list = [Worker(80, 7000, 8), Worker(80, 8000, 8), Worker(40, 5000, 9), Worker(30, 5000, 5), Worker(30, 6000, 5),
               Worker(30, 6000, 6)]

sorted(worker_list,key=lambda Worker:(Worker.age,Worker.salary,Worker.level))
for worker in worker_list:
    print(worker)

升序降序与稳定排序

list.sort() 和 sorted() 接受布尔值的 reverse 参数,这用于标记降序排序。
排序保证是 稳定 的。 这意味着当多个记录具有相同的键值时,将保留其原始顺序。
这个属性允许在一系列排序步骤中构建复杂的排序。例如,要按 grade 降序然后 age 升序对学生数据进行排序,请先 age 排序,然后再使用 grade 排序:

s = sorted(student_objects, key=attrgetter('age'))
sorted(s, key=attrgetter('grade'), reverse=True)
# [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

你可能感兴趣的:(python,python,排序算法)