python筆記(2)排序函數sorted的用法

python3中sort和sorted的用法

本文參考https://www.cnblogs.com/znyyy/p/7716077.html
python3 sorted取消了對cmp的支持,格式:sorted(iterable,key=None,reverse=False),key接受一個函數,這個函數只接受一個元素,默認爲None;reverse是一個布爾值。如果設置爲True,列表元素將被倒序排列,默認爲False。key的作用原理:key指定一個接收一個參數的函數,這個函數用於從每個元素中提取一個用於比較的關鍵字。默認值爲None。
這裏有一個例子

#1.按照年齡來排序
students = [('牛牛', 'A', 15), ('道長', 'B', 12), ('大師兄','B', 10)]
students=sorted(students,key=lambda s:s[2])
print(students)
#結果:[('大師兄', 'B', 10), ('道長', 'B', 12), ('牛牛', 'A', 15)]

這裏是另外一個例子

#2.一個字符串排序,排序規則:小寫<大寫<奇數<偶數,
# 原理:先比較元組的第一個值,FALSE<TRUE,如果相等就比較元組的下一個值,以此類推。
# 先看一下Boolean value 的排序:
# print(sorted([True,Flase]))===>結果[False,True]
# Boolean 的排序會將 False 排在前,True排在後 . 

s='9a13C85c7B24A6b' #正確的順序應該爲:abcABC135792468
lis=sorted(s,key=lambda x:(x.isdigit(),x.isdigit() and int(x)%2==0,x.isalpha() and x.isupper(),x.isalpha() and x.lower()))
print(''.join(lis))

# 1.x.isdigit()的作用是把數字放在後邊,字母放在前邊.
# 2.x.isdigit() and int(x) % 2 == 0的作用是保證奇數在前,偶數在後。
# 3.x.isupper()的作用是在前面基礎上,保證字母小寫在前大寫在後.
# 4.最後的x表示在前面基礎上,對所有類別數字或字母排序。

值得注意的是在lambda中有4個連續的函數,前面的優先級要高於後面的優先級
key = len就是按照長度來排

在python3中取消了使用cmp自定義函數來進行比較然後排序的方法(類似於C++的qsort),而是改用了以下方法,使用cmp_to_key函數對其進行了包裝:

比如現在有一個題目:

設有n個正整數,將他們連接成一排,組成一個最大的多位整數。
如:n=3時,3個整數13,312,343,連成的最大整數爲34331213。
如:n=4時,4個整數7,13,4,246連接成的最大整數爲7424613。

使用Python2可以這樣完成:

def compare(s1, s2):
    if s1+s2>s2+s1:
        return -1
    elif s1+s2<s2+s1:
        return 1
    else:
        return 0
n = int(raw_input())
arr = raw_input().split()
arr = sorted(arr, compare)
print(''.join(arr))

而在python3中無法直接使用compare函數,因此需要從functools中導入cmp_to_key
,然後再用相同的方法使用。

from functools import cmp_to_key
def compare(s1, s2):
    if s1+s2>s2+s1:
        return -1
    elif s1+s2<s2+s1:
        return 1
    else:
        return 0
n = int(input())
arr = input().split()
arr = sorted(arr, key = cmp_to_key(compare))
print(''.join(arr))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章