校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Python 中 sorted 如何自定義比較邏輯

Python 中 sorted 如何自定義比較邏輯

熱門標簽:滴滴地圖標注公司 如何申請400電話代理 400電話在線如何申請 地圖標注可以遠程操作嗎 天津塘沽區地圖標注 江門智能電話機器人 智能電話機器人調研 甘肅高頻外呼系統 杭州房產地圖標注

在 Python 中對一個可迭代對象進行排序是很常見的一個操作,一般會用到 sorted() 函數

num_list = [4, 2, 8, -9, 1, -3]
sorted_num_list = sorted(num_list)
print(sorted_num_list)

上面的代碼是對整數列表 num_list 按從小到大的順序進行排序,得到的結果如下

[-9, -3, 1, 2, 4, 8]

有時候不僅僅是對元素本身進行排序,而是在元素值的基礎上進行一些計算之后再進行比較,比如將 num_list 中的元素按照其平方值的大小進行排序。

在 Python 2 中,可以通過 sorted() 函數中的 cmp 或 key 參數來實現這種自定義的比較邏輯。cmp 比較函數接收兩個參數 x 和 y(x 和 y 都是列表中元素)并且返回一個數字,如果返回正數表示 x > y,返回 0 表示 x == y,返回負數表示 x y。key 函數接收一個參數,重新計算出一個結果,然后用計算出的結果參與排序比較。因此在 Python 2 中按平方值大小排序可以有下面兩種實現方式

num_list = [4, 2, 8, -9, 1, -3]
# cmp 參數只在 Python 2 中存在,Python 3 及之后的版本移除了 cmp 參數
sorted_num_list = sorted(num_list, cmp=lambda x, y: x ** 2 - y ** 2)
sorted_num_list = sorted(num_list, key=lambda x: x ** 2)

但是隨著 Python 3.0 的發布,cmp 參數也隨之被移除了,也就是說在 Python 3 中自定義比較邏輯就只能通過 key 參數來實現。至于為什么將 cmp 參數移除,在 Python 的 Issue tracker 中有一段很長的討論,主要有以下兩點原因

  • cmp 是一個冗余參數,所有使用 cmp 的場景都可以用 key 來代替
  • 使用 key 比使用 cmp 的性能更快,對于有 N 個元素的列表,在排序過程中如果調用 cmp 進行比較,那么 cmp 的調用次數為 Nlog(N) 量級(基于比較的排序的最快時間復雜度),如果使用 key 參數,那么只需要在每個元素上調用一次 key 函數,只有 N 次調用,雖然使用 key 參數也要進行 O(Nlog(N)) 量級比較次數,但這些比較是在 C 語言層,比調用用戶自定義的函數快。

關于上面性能的問題,我做了一個實驗,分別隨機生成 1000、10000、100000 和 1000000 個整數,然后用 key 和 cmp 的方式分別進行排序并記錄排序的時間消耗

import random
import time

counts = (1000, 10000, 100000, 1000000)

def custom_cmp(x, y):
  return x ** 2 - y ** 2

def custom_key(x):
  return x ** 2

print('%7s%20s%20s' % ('count', 'cmp_duration', 'key_duration'))
for count in counts:
  min_num = -count // 2
  max_num = count // 2
  nums = [random.randint(min_num, max_num) for _ in range(count)]
  start = time.time()
  sorted(nums, cmp=custom_cmp)
  cmp_duration = time.time() - start
  start = time.time()
  sorted(nums, key=custom_key)
  key_duration = time.time() - start
  print('%7d%20.2f%20.2f' % (count, cmp_duration, key_duration))

在我的筆記本上一次運行結果如下

 count    cmp_duration    key_duration
  1000        0.00        0.00
 10000        0.02        0.01
 100000        0.34        0.11
1000000        4.75        1.85

可以看到,當列表中數字的數量超過 100000 的時候,使用 key 函數的性能優勢就非常明顯了,比 cmp 快了 2~3 倍。

對于熟悉 Java 或 C++ 等其他編程語言的同學來說,可能更熟悉 cmp 的比較方式。其實 Python 3 中也可以通過 functools 工具包中的 cmp_to_key() 函數來將 cmp 轉換成 key,從而使用接收兩個參數的自定義比較函數 cmp。

import functools

num_list = [4, 2, 8, -9, 1, -3]

def custom_cmp(x, y):
  return x ** 2 - y ** 2

sorted_num_list = sorted(num_list, key=functools.cmp_to_key(custom_cmp))
print(sorted_num_list)

那么,cmp_to_key() 函數是如何將 cmp 轉換成 key 的呢,我們可以通過源碼一探究竟

def cmp_to_key(mycmp):
  """Convert a cmp= function into a key= function"""
  class K(object):
    __slots__ = ['obj']
    def __init__(self, obj):
      self.obj = obj
    def __lt__(self, other):
      return mycmp(self.obj, other.obj)  0
    def __gt__(self, other):
      return mycmp(self.obj, other.obj) > 0
    def __eq__(self, other):
      return mycmp(self.obj, other.obj) == 0
    def __le__(self, other):
      return mycmp(self.obj, other.obj) = 0
    def __ge__(self, other):
      return mycmp(self.obj, other.obj) >= 0
    __hash__ = None
  return K

其實 cmp_to_key() 返回的是一個類 K,只不過在類 K 中重載了各種比較運算符,重載的過程中使用到了自定義的比較函數 mycmp,使得 K 的大小比較邏輯與 mycmp 一致。這樣,對于 num_list 中的每個元素 num 都會執行一次 K(num) 生成一個類 K 的實例,然后通過比較不同 K 的實例的大小進行排序。

雖然通過 cmp_to_key() 可以調用自定義的 cmp 函數,但是還是要優先使用 key 函數,因為通過 cmp_to_key() 方式會在排序過程中創建很多類 K 的實例,對性能有很大影響,下面是 cmp_to_key() 和 key 的性能比較

 count     cmp_to_key    key_duration
  1000        0.01        0.00
 10000        0.10        0.01
 100000        1.36        0.09
1000000        16.89        1.13

當 num_list 中的數量為 1000000 的時候 key 比 cmp_to_key 快了將近 15 倍。

本文主要介紹了如何在 sorted 函數中自定義比較邏輯,Python 2 中可以通過 cmp 或 key 來實現,cmp 接收 2 個參數,通過返回的數值來判斷兩個參數的大小,key 重新計算一個新的結果參與比較。在 Python 3 中,考慮到 cmp 的性能和冗余的原因,將其移除了。在 Python 3.2 中提供了 functools.cmp_to_key 這個函數來使用自定義的比較函數 cmp,但是出于性能的考慮,我們還是要優先使用 key 來進行排序。

以上就是Python 中 sorted 如何自定義比較邏輯的詳細內容,更多關于python sorted自定義比較邏輯的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • Python自定義sorted排序實現方法詳解
  • 詳解python中的lambda與sorted函數
  • Python sorted對list和dict排序
  • python中sort sorted reverse reversed函數的區別說明
  • Python sorted排序方法如何實現
  • Python3 中sorted() 函數的用法
  • python3 sorted 如何實現自定義排序標準
  • python3中sorted函數里cmp參數改變詳解
  • Python中sorted()排序與字母大小寫的問題

標簽:德宏 廊坊 東莞 長春 臨汾 重慶 漢中 河池

巨人網絡通訊聲明:本文標題《Python 中 sorted 如何自定義比較邏輯》,本文關鍵詞  Python,中,sorted,如何,自定義,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python 中 sorted 如何自定義比較邏輯》相關的同類信息!
  • 本頁收集關于Python 中 sorted 如何自定義比較邏輯的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    风间由美性色一区二区三区| 色综合av在线| 日韩午夜精品视频| 日韩高清国产一区在线| 精品国产一区二区三区久久影院| 天堂一区二区在线免费观看| 日韩午夜三级在线| 国产福利91精品| 艳妇臀荡乳欲伦亚洲一区| 欧美撒尿777hd撒尿| 久久精品99国产精品日本| 久久亚洲精品小早川怜子| 久久久久久久国产精品影院| 美国欧美日韩国产在线播放| 国产精品美女视频| 欧美日韩日日骚| 懂色一区二区三区免费观看| 国产一区二区免费视频| 国产综合色在线| 91精选在线观看| 国产欧美日韩三区| 国产欧美1区2区3区| 亚洲欧美在线aaa| 91网站视频在线观看| 国产一区在线不卡| 午夜国产不卡在线观看视频| 国产精品对白交换视频| 日韩欧美一卡二卡| 欧美丝袜丝交足nylons图片| 高清不卡一区二区在线| 日韩电影免费在线观看网站| 亚洲欧美色综合| 亚洲精品成人天堂一二三| 中文一区二区完整视频在线观看| 欧美精品一区在线观看| 欧美精品777| 欧美伦理影视网| 欧美精品三级日韩久久| 91精品免费观看| 久久中文娱乐网| 国产精品嫩草影院com| 中文字幕不卡三区| 亚洲精品国产第一综合99久久| 亚洲图片你懂的| 石原莉奈在线亚洲二区| 日本aⅴ免费视频一区二区三区| 日本最新不卡在线| 国产一区二区三区免费| 成人h动漫精品一区二| 欧美性欧美巨大黑白大战| 欧美一级在线观看| 国产清纯白嫩初高生在线观看91 | 国产真实乱偷精品视频免| 免费成人av在线| 色综合av在线| 精品久久久久久无| 一区二区三区四区精品在线视频 | 日韩精品国产精品| 国产不卡视频在线观看| 91高清在线观看| 国产欧美精品一区二区色综合朱莉| 亚洲午夜久久久久久久久久久| 精品一区二区三区视频| 91精品国产综合久久久久久久 | 7777精品伊人久久久大香线蕉的 | 中文字幕欧美激情| 香港成人在线视频| 99国产麻豆精品| 国产精品女主播在线观看| 精品一区二区三区在线观看| 欧美精品粉嫩高潮一区二区| 成人欧美一区二区三区视频网页| 国产在线精品视频| 2017欧美狠狠色| 美日韩一级片在线观看| 日韩免费一区二区三区在线播放| 亚洲电影一区二区| 欧美一区日韩一区| 久久精品国产秦先生| 日韩女优电影在线观看| 男女视频一区二区| 91精品国产综合久久香蕉麻豆| 欧美一区二区三区播放老司机| 欧美日韩国产一级二级| 国产精品视频看| hitomi一区二区三区精品| 一区二区三区在线观看国产| 欧洲av一区二区嗯嗯嗯啊| 亚洲一区二区五区| 欧美日韩在线播放三区| 国产一区二区三区| 国产精品久久午夜夜伦鲁鲁| 欧美性猛交xxxxxx富婆| 国内精品久久久久影院色 | 在线不卡一区二区| 国产一区二区三区香蕉| 国产精品毛片无遮挡高清| 91黄色免费观看| 成人午夜激情视频| 亚洲国产日韩在线一区模特| 久久精品视频在线看| 欧美无砖砖区免费| 国产成人av一区二区| 亚洲福利视频一区| 国产精品美女久久久久久久| 欧美麻豆精品久久久久久| 国产美女一区二区| 青青草原综合久久大伊人精品优势| 欧美激情在线观看视频免费| 69堂国产成人免费视频| 在线看一区二区| 97久久超碰国产精品电影| 国产超碰在线一区| 国产精品一级在线| 亚洲18色成人| 一区二区久久久久久| 亚洲欧洲av一区二区三区久久| 中国色在线观看另类| 中文字幕av在线一区二区三区| 精品88久久久久88久久久| 日韩免费视频线观看| 精品国产91乱码一区二区三区 | 理论电影国产精品| 韩国成人精品a∨在线观看| 经典三级视频一区| 粉嫩欧美一区二区三区高清影视| 国产成人av福利| eeuss影院一区二区三区| 色婷婷国产精品综合在线观看| 日本韩国精品一区二区在线观看| 欧美性生交片4| wwwwww.欧美系列| 国产精品三级视频| 亚洲综合视频网| 精品亚洲成a人| 懂色av噜噜一区二区三区av| 色播五月激情综合网| 日韩欧美一卡二卡| 亚洲精品视频在线看| 蜜桃久久精品一区二区| 国产成人av自拍| 欧美一区二区美女| 日本一区二区综合亚洲| 婷婷综合另类小说色区| 国产一区二区三区久久久 | 欧美电影在哪看比较好| 亚洲国产精品激情在线观看| 日韩精品国产欧美| 色国产精品一区在线观看| 国产欧美综合色| 国内不卡的二区三区中文字幕 | 亚洲精品一线二线三线无人区| 夜夜嗨av一区二区三区中文字幕| 蜜臀91精品一区二区三区| 欧美唯美清纯偷拍| 一区二区三区免费观看| 91在线你懂得| 亚洲欧美区自拍先锋| 在线观看亚洲精品| 亚洲韩国精品一区| 国产欧美日韩另类一区| 亚洲视频一区在线| 成人综合日日夜夜| 欧美高清一级片在线观看| 国产精品资源站在线| 国产精品水嫩水嫩| 不卡的av网站| 亚洲综合一二三区| 日韩午夜激情av| 麻豆精品在线看| 久久精品亚洲麻豆av一区二区 | 青青草国产精品亚洲专区无| 欧美一区二区免费| 国产精品亚洲а∨天堂免在线| 国产亚洲成aⅴ人片在线观看 | av高清不卡在线| 日日摸夜夜添夜夜添精品视频 | 日韩欧美国产电影| 国产精品亚洲人在线观看| 亚洲美女屁股眼交3| 欧美一区二区三区不卡| 成人黄色软件下载| 日韩成人精品在线观看| 中文字幕一区二区三区视频| 欧美久久久久久久久中文字幕| 国产黄色成人av| 精品综合免费视频观看| 国产精品久线观看视频| 久久伊99综合婷婷久久伊| 色欧美乱欧美15图片| 国产成人综合在线| 国产乱一区二区| 久久精品国产精品亚洲综合| 午夜免费久久看| 亚洲一区免费在线观看| 精品福利av导航| 日韩美一区二区三区| 欧美丰满美乳xxx高潮www| 欧美亚洲丝袜传媒另类| 色素色在线综合|