日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

内置函数sorted的10个小tips

發布時間:2025/7/14 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内置函数sorted的10个小tips 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

sorted 用于對集合進行排序(這里說的集合是對可迭代對象的一個統稱,他們可以是列表、字典、set、甚至是字符串),它的功能非常強大,本文將深入淺出地介紹 sorted 的各種使用場景。

1、默認排序

1、默認情況,sorted 函數將按列表升序進行排序,并返回一個新列表對象,原列表保持不變,最簡單的排序

>>> nums = [3,4,5,2,1] >>> sorted(nums) [1, 2, 3, 4, 5] 復制代碼

2、降序排序

2、降序排序,如果要按照降序排列,只需指定參數 reverse=True 即可

>>> sorted(nums, reverse=True) [5, 4, 3, 2, 1] 復制代碼

3、自定義規則排序

3、如果要按照某個特定的規則排序,則需指定參數 key, key 是一個函數(或其它可調用對象),例如:一個字符串構成的列表,我想按照字符串的長度來排序

>>> chars = ['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']>>> sorted(chars, key=len) ['a', 'is', 'from', 'test', 'This', 'Andrew', 'string'] 復制代碼

len 是內建函數,sorted 函數在排序的時候會用len去獲取每個字符串的長度來排序。 有些人可能使用匿名函數 key=lambda x: len(x) ,其實是多此一舉。

>>> chars = ['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']>>> sorted(chars, key=lambda x: len(x)) ['a', 'is', 'from', 'test', 'This', 'Andrew', 'string'] 復制代碼

4、復合排序

4、如果是一個復合列表結構,例如:由元組構成的列表,要按照元組中的第二個元素排序,那么可以用 lambda 定義一個匿名函數,這里就是按照第二個元素的字母升序來排列的

>>> students = [('zhang', 'A'), ('li', 'D'), ('wang', 'C')] >>> sorted(students, key=lambda x: x[1]) [('zhang', 'A'), ('wang', 'C'), ('li', 'D')] 復制代碼

這里將按照字母 A-C-D 的順序排列。

5、類的實例對象排序

5、如果要排序的元素是自定義類,例如Student類按照年齡來排序,則可以寫成

>>> class Student:def __init__(self, name, grade, age):self.name = nameself.grade = gradeself.age = agedef __repr__(self):return repr((self.name, self.grade, self.age))>>> student_objects = [Student('john', 'A', 15),Student('jane', 'B', 12),Student('lily', 'A', 12),Student('dave', 'B', 10), ] >>> sorted(student_objects, key=lambda t:t.age) [('dave', 'B', 10), ('jane', 'B', 12), ('lily', 'A', 12), ('john', 'A', 15)] 復制代碼

6、多個值排序

6、和數據庫的排序一樣,sorted 也可以根據多個字段來排序,例如我有先要根據age排序,如果age相同的則根據grade排序,則可以使用元組:

>>> sorted(student_objects, key=lambda t:(t.age, t.grade)) [('dave', 'B', 10), ('lily', 'A', 12), ('jane', 'B', 12), ('john', 'A', 15)]復制代碼

7. 不可直接比較的值排序

7、前面碰到的排序場景都是建立在兩個元素是可以互相比較的前提下,例如數值按大小比較, 字母按ASCII順序比較,如果遇到本身是不可比較的,需要我們自己來定義比較規則的情況如何處理呢?

舉個簡單的例子:

>>> nums = [2, 1.5, 2.5, '2', '2.5'] >>> sorted(nums) TypeError: '<' not supported between instances of 'str' and 'int' 復制代碼

一個整數列表中,可能有數字,字符串,在Python3中,字符串與數值是不能比較的,而Python2中任何類型都可以比較,這是兩個版本中一個很大的區別:

# python2.7 >>> "2.5" > 2 True# python3.6 >>> "2.5" > 2 TypeError: '>' not supported between instances of 'str' and 'int' 復制代碼

我們需要使用 functools 模塊中的 cmp_to_key 來指定比較函數是什么。

import functools def compare(x1, x2):if isinstance(x1, str):x1 = float(x1)if isinstance(x2, str):x2 = float(x2)return x1 - x2>>>sorted(nums, key=functools.cmp_to_key(compare)) [1.5, 2, '2', 2.5, '2.5'] 復制代碼

8、定義com_to_key

8、關于 sorted 函數,Python2和Python3之間的區別是Python2中的sorted 可以指定cmp關鍵字參數,就是當遇到需要自定義比較操作的數據可以通過 cmp=compare 來實現,不需要像Python3中還需要導入functools.cmp_to_key實現。

nums = [2, 1.5, 2.5, '2', '2.5']def compare(x1, x2):if isinstance(x1, str):x1 = float(x1)if isinstance(x2, str):x2 = float(x2)return 1 if x1 - x2 > 0 else -1 if x1 - x2 < 0 else 0>>> sorted(nums, cmp=compare) [1.5, 2, '2', 2.5, '2.5'] 復制代碼

其實,在Python2中,上面這種情況你不指定cmp,默認也會按照這種方式排序,記住,Python2中,任何東西(不同類型之間)都可以比較,而Python3只有同類型數據可以比較。

9、優化排序

9、 對于集合構成的列表,有一種更高效的方法指定這個key

>>> from operator import itemgetter >>> sorted(students, key=itemgetter(1)) [('zhang', 'A'), ('wang', 'C'), ('li', 'D')] 復制代碼

10、高級排序

10、同樣的,對于自定義類,也有一種更高效的方法指定key

>>> from operator import attrgetter >>> sorted(student_objects, key=attrgetter('age')) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] 復制代碼

如果參與排序的字段有兩個怎么辦,你可以這樣:

>>> sorted(student_objects, key=attrgetter('grade', 'age')) [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)] 復制代碼

以上是關于 sorted 函數的全部。

同步發表博客:foofish.net/python-sort…

關注一下,第一時間獲取更多好文

總結

以上是生活随笔為你收集整理的内置函数sorted的10个小tips的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。