Python中用來排序的方法sort、sorted

小小程序员ol發表於2024-07-20

sort 與 sorted 區別:

  1. sort 是應用在 list 上的方法,而sorted 可以對所有可迭代的物件(他們可以是list、dict、set、甚至是字串)進行排序操作。
  2. list 的 sort 方法返回的是對已經存在的列表進行操作,無返回值,而內建函式 sorted 方法返回的是一個新的 list,而不是在原來的基礎上進行的操作。
  3. sorted方法為內建方法,sort方法為屬性方法。
  4. sort是在原位重新排列列表,而sorted()是產生一個新的列表。
  5. 推薦使用內建方法,效率更高,所以使用sorted更好。

sort方法原型:

>>> help(list.sort)
L.sort(cmp=None, key=None, reverse=False)

sorted方法原型:

>>> help(sorted)
sorted(iterable,key=None, reverse=False)

引數說明:

  • iterable -- 可迭代物件。
  • cmp -- 比較的函式,這個具有兩個引數,引數的值都是從可迭代物件中取出,此函式必須遵守的規則為,大於則返回1,小於則返回-1,等於則返回0。
  • key -- 主要是用來進行比較的元素,只有一個引數,具體的函式的引數就是取自於可迭代物件中,指定可迭代物件中的一個元素來進行排序。
  • reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(預設)。

sorted使用方法

1、對列表排序,返回的物件不會改變原列表,返回新列表

list = [1,5,7,2,4]
sorted(list)
Out[87]: [1, 2, 4, 5, 7]
#可以設定時候排序方式,預設從小到大,設定reverse = False 可以從大到小
sorted(list,reverse=False)
Out[88]: [1, 2, 4, 5, 7]
sorted(list,reverse=True)
Out[89]: [7, 5, 4, 2, 1]

2、根據自定義規則來排序,使用引數:key

# 使用key,預設搭配lambda函式使用
sorted(chars,key=lambda x:len(x))
Out[92]: ['a', 'is', 'boy', 'bruce', 'handsome']

sorted(chars,key=lambda x:len(x),reverse= True)
Out[93]: ['handsome', 'bruce', 'boy', 'is', 'a']

3、根據自定義規則來排序,對元組構成的列表進行排序

tuple_list = [('A', 1,5), ('B', 3,2), ('C', 2,6)]
#key=lambda x: x[1]中可以任意選定x中可選的位置進行排序
sorted(tuple_list, key=lambda x: x[1]) 

Out[94]: [('A', 1, 5), ('C', 2, 6), ('B', 3, 2)]

sorted(tuple_list, key=lambda x: x[0])
Out[95]: [('A', 1, 5), ('B', 3, 2), ('C', 2, 6)]

sorted(tuple_list, key=lambda x: x[2])
Out[96]: [('B', 3, 2), ('A', 1, 5), ('C', 2, 6)]

4、排序的元素是自定義類

class tuple_list:
    def __init__(self, one, two, three):
        self.one = one
        self.two = two
        self.three = three
    def __repr__(self):
        return repr((self.one, self.two, self.three))

tuple_list_ = [tuple_list('A', 1,5), tuple_list('B', 3,2), tuple_list('C', 2,6)]
sorted(tuple_list_, key=lambda x: x.one)
Out[104]: [('A', 1, 5), ('B', 3, 2), ('C', 2, 6)]
sorted(tuple_list_, key=lambda x: x.two)
Out[105]: [('A', 1, 5), ('C', 2, 6), ('B', 3, 2)]
sorted(tuple_list_, key=lambda x: x.three)
Out[106]: [('B', 3, 2), ('A', 1, 5), ('C', 2, 6)]

5、sorted 也可以根據多個欄位來排序

class tuple_list:
    def __init__(self, one, two, three):
        self.one = one
        self.two = two
        self.three = three
    def __repr__(self):
        return repr((self.one, self.two, self.three))

tuple_list_ = [tuple_list('C', 1,5), tuple_list('A', 3,2), tuple_list('C', 2,6)]
# 首先根據one的位置來排序,然後根據two的位置來排序
sorted(tuple_list_, key=lambda x:(x.one, x.two))
Out[112]: [('A', 3, 2), ('C', 1, 5), ('C', 2, 6)]

6、使用operator 中的itemgetter方法和attrgetter方法

tuple_list = [('A', 1,5), ('B', 3,2), ('C', 2,6)]
class tuple_list_class:
    def __init__(self, one, two, three):
        self.one = one
        self.two = two
        self.three = three
    def __repr__(self):
        return repr((self.one, self.two, self.three))
tuple_list_ = [tuple_list_class('C', 1,5), tuple_list_class('A', 3,2), tuple_list_class('C', 2,6)]
from operator import itemgetter
sorted(tuple_list, key=itemgetter(1))
Out[119]: [('A', 1, 5), ('C', 2, 6), ('B', 3, 2)]
from operator import attrgetter
sorted(tuple_list_, key=attrgetter('one')) # attrgetter 傳入的引數必須是str
Out[120]: [('A', 3, 2), ('C', 1, 5), ('C', 2, 6)] 
# 如果是根據多個類的引數排序,按照引數定義順序
from operator import attrgetter
sorted(tuple_list_, key=attrgetter('two','one'))
Out[121]: [('C', 1, 5), ('C', 2, 6), ('A', 3, 2)]

高階用法

有時候,我們要處理的資料內的元素不是一維的,而是二維的甚至是多維的,那要怎麼進行排序呢?這時候,sorted()函式內的key引數就派上用場了!從幫助資訊上可以瞭解到,key引數可傳入一個自定義函式。那麼,該如何使用呢?讓我們看看如下程式碼:

>>>l=[('a', 1), ('b', 2), ('c', 6), ('d', 4), ('e', 3)]
>>>sorted(l, key=lambda x:x[0])
Out[39]: [('a', 1), ('b', 2), ('c', 6), ('d', 4), ('e', 3)]
>>>sorted(l, key=lambda x:x[0], reverse=True)
Out[40]: [('e', 3), ('d', 4), ('c', 6), ('b', 2), ('a', 1)]
>>>sorted(l, key=lambda x:x[1])
Out[41]: [('a', 1), ('b', 2), ('e', 3), ('d', 4), ('c', 6)]
>>>sorted(l, key=lambda x:x[1], reverse=True)
Out[42]: [('c', 6), ('d', 4), ('e', 3), ('b', 2), ('a', 1)]

這裡,列表裡面的每一個元素都為二維元組,key引數傳入了一個lambda函式表示式,其x就代表列表裡的每一個元素,然後分別利用索引返回元素內的第一個和第二個元素,這就代表了sorted()函式利用哪一個元素進行排列。而reverse引數就如同上面講的一樣,起到逆排的作用。預設情況下,reverse引數為False。
當然,正如一開始講到的那樣,如果想要對列表直接進行排序操作,可以用成員方法sort()來做:

#學習中遇到問題沒人解答?小編建立了一個Python學習交流群:725638078
>>>l.sort(key=lambda x : x[1])
>>>l
Out[45]: [('a', 1), ('b', 2), ('e', 3), ('d', 4), ('c', 6)]
>>>l.sort(key=lambda x : x[1], reverse=True)
>>>l
Out[47]: [('c', 6), ('d', 4), ('e', 3), ('b', 2), ('a', 1)]

對於三維及以上的資料排排序,上述方法同樣適用。

相關文章