2019年11月28日 星期四

[ Python 文章收集 ] Python3:找回 sort() 中消失的 cmp 參數

Source From Here
問題描述
當小伙伴們愉快地用 Python2 中 list 的 sort() 方法的 cmp 參數排序時:
  1. nums = [1324]  
  2. nums.sort(cmp=lambda a, b: a - b)  
  3. print(nums)  # [1234]  
卻發現在 Python3 下竟然報錯了:
  1. Traceback (most recent call last):  
  2.   File "temp.py", line 2, in   
  3.     nums.sort(cmp=lambda a, b: a - b)  
  4. TypeError: 'cmp' is an invalid keyword argument for this function  

找不到 cmp 參數?WTF?還怎麼愉快玩耍?

原因分析
馬上去看官方文檔,Python2 下的 sort()
  1. sort(cmp=None, key=None, reverse=False)  
再看看Python3下:
  1. sort(*, key=None, reverse=None)  
好取消 Python3 下真的把 cmp 參數給取消掉了。原因是為了簡化和統一Python語言,於是就把 sort() 方法中的 cmp 參數給取消掉了.

解決方法
為了照顧到廣大 cmp 用戶的心情,Python3 還是留了一條活路的,用就是 functools.cmp_to_key() 來曲線救國啦,廢話不多說,直接上代碼:
>>> from functools import cmp_to_key
>>> nums = [1, 3, 2, 4]
>>> nums.sort(key=cmp_to_key(lambda a, b: a - b))
>>> nums
[1, 2, 3, 4]

>>> nums.sort(key=cmp_to_key(lambda a, b: b - a))
>>> nums
[4, 3, 2, 1]

如果是使用 sorted 函數的話, 則可以如下:
>>> nums = [1, 3, 2, 4]
>>> sorted(nums, key=lambda e: e % 2)
[2, 4, 1, 3]

>>> sorted(nums, key=lambda e: 1 - (e % 2))
[1, 3, 2, 4]


Reference
Data Structures; Python 2.7.13 documentation
Built-in Types; Python 3.6.1 documentation
Sorting HOW TO; Python 3.6.1 documentation
functools — Higher-order functions and operations ...ts; Python 3.6.1 documentation

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...