1. 程式人生 > >Python3內建函式-sorted

Python3內建函式-sorted

功能

對一個可迭代物件(iterable)進行排序,返回一個新列表

語法

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

引數

  • iterable:可迭代物件

  • key:用來進行元素比較的引數,可以由程式設計師指定可迭代物件中的同一位置元素來進行排序。key是快速的,因為key指定的函式將準確地對每個元素呼叫。key可以使用匿名函式lambda

  • reverse:排序規則,可選關鍵字引數,預設值False,升序排列;True,降序排列

返回值

返回一個重新排序的新列表

例項

  • 使用可選關鍵字引數reverse

reverse(意為反轉)用來確定排序結果是否反轉,預設值是False(升序排列),可指定值為True(降序排列)

print(sorted('dcabegf'))                   # 預設升序

print(sorted('dcabegf', reverse = True))   # 降序排列
  • 使用key方法

key是一個方法,預設值是None,用來指定具體的排序演算法;sorted對可迭代物件的每個元素使用key演算法後再排序,返回一個排序後的可迭代物件。

# 按年齡排序,以列表元素tuple的第3個索引排序,升序排序
students=[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

print(sorted(students, key=lambda
s: s[2])) print(sorted(students, key=lambda s: s[2], reverse=True)) # 降序排序
# 字元轉換成小寫後再排序,'a'和'A'值一樣
a = ['a','s','d','X','D','U','H','G','E','s','d','a','s']

sorted(a, key = str.lower) 
# sort by age
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)] sorted(student_objects, key=lambda student: student.age)
  • sort與sorted區別

sort是應用在list上的方法(或叫成員函式),而sorted可以對所有可迭代的物件進行排序操作的內建函式。

# sort僅能修改list,sort在原來的list上進行操作
L = [5, 2, 3, 1, 4]

L.sort()
print(L) 

# sorted()對所有的可迭代序列都有效
sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})

list的sort方法是在原位重新排列列表,而sorted()是產生一個新的列表,而不是在原來的基礎上進行操作。

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

b = sorted(a)       # 保留原列表a
print(a)
print(b)
  • operator模組函式

key引數的使用非常廣泛,因此python提供了一些方便的函式,使得訪問方法更加容易和快速。operator模組有itemgetter,attrgetter,methodcaller方法。使用這些方法,上面的操作將變得更加簡潔和快速。

from operator import itemgetter

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

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

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

sorted(student_objects, key=attrgetter('age'))

operator模組還允許多級排序,例如先以grade,然後再以age來排序

from operator import itemgetter,attrgetter

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

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

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