1. 程式人生 > >Python中的排序方法

Python中的排序方法

name key 一個 是個 成績 詳細 pytho ted def

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‘]

Python中的排序方法