摘要:一需要用到的函數需要用到的函數很少,基本上就是和。這個參數的默認值是恒等函數,也就是默認用元素自己的值來排序。后的函數會代入列表里的每一項返回一個優先級數字,并以這個優先級數字排序
一、需要用到的函數
需要用到的函數很少,基本上就是sorted()和lambda。
sorted()函數原型:
sorted(iterable[,key][,reverse])
可見sorted()可以接受3個參數,需要排序的變量必不可少,然后是key指定排序的元素,reverse指定是否逆序。
key:一個只有一個參數的函數,這個函數會被用在序列里的每一個元素上,所產生的結果將是排序算法依賴的對比關鍵字。比如說,在對一些字符串排序時,可以用key=len來實現根據字符串的長度進行排序。這個參數的默認值是恒等函數,也就是默認用元素自己的值來排序 (key=lambda x: x)。
lambda實際上就是匿名函數
一般形式:
lambda arguments: expression
寫成函數形式就是
def(arguments): return expression
當lambda和sorted()的key參數結合就有意想不到的效果了。
二、各種排序
1.簡單list排序
lis = ["a", "b", "c"] print(sorted(lis)) # ["a", "b", "c"] print(sorted(lis, reverse=True)) # ["c", "b", "a"]
2.dict的key排序
dic = {"c": 1, "b": 2, "a": 3} #字典排序默認按照字典的key排序,返回的也是字典的key print(sorted(dic)) # ["a", "b", "c"] print(sorted(dic, reverse=True)) # ["c", "b", "a"]
3.dict的value排序
dic = {"c": 1, "b": 2, "a": 3} print(sorted(dic, key=lambda k: dic[k])) #dic([k])就是value # ["c", "b", "a"] print(sorted(dic, key=lambda k: dic[k], reverse=True)) # ["a", "b", "c"]
4.list內嵌套list排序
lis = [[4, 2, 9], [1, 5, 6], [7, 8, 3]] print(sorted(lis, key=lambda k: k[0])) #列表內的沒項代入key后的表達式,根據返回值排序 # [[1, 5, 6], [4, 2, 9], [7, 8, 3]] print(sorted(lis, key=lambda k: k[1])) # [[4, 2, 9], [1, 5, 6], [7, 8, 3]] print(sorted(lis, key=lambda k: k[2])) # [[7, 8, 3], [1, 5, 6], [4, 2, 9]] print(sorted(lis, key=lambda k: k[0], reverse=True)) # [[7, 8, 3], [4, 2, 9], [1, 5, 6]]
5.dict內嵌套dict排序
dic = { "a": {"x": 3, "y": 2, "z": 1}, "b": {"x": 2, "y": 1, "z": 3}, "c": {"x": 1, "y": 3, "z": 2}, } print(sorted(dic, key=lambda k: dic[k]["x"])) # ["c", "b", "a"] print(sorted(dic, key=lambda k: dic[k]["y"])) # ["b", "a", "c"] print(sorted(dic, key=lambda k: dic[k]["z"])) # ["a", "c", "b"] print(sorted(dic, key=lambda k: dic[k]["x"], reverse=True)) # ["a", "b", "c"]
6.list內嵌套dict排序
lis = [ {"x": 3, "y": 2, "z": 1}, {"x": 2, "y": 1, "z": 3}, {"x": 1, "y": 3, "z": 2}, ] print(sorted(lis, key=lambda k: k["x"])) # [{"z": 2, "x": 1, "y": 3}, {"z": 3, "x": 2, "y": 1}, {"z": 1, "x": 3, "y": 2}] print(sorted(lis, key=lambda k: k["y"])) # [{"z": 3, "x": 2, "y": 1}, {"z": 1, "x": 3, "y": 2}, {"z": 2, "x": 1, "y": 3}] print(sorted(lis, key=lambda k: k["z"])) # [{"z": 1, "x": 3, "y": 2}, {"z": 2, "x": 1, "y": 3}, {"z": 3, "x": 2, "y": 1}] print(sorted(lis, key=lambda k: k["x"], reverse=True)) # [{"z": 1, "x": 3, "y": 2}, {"z": 3, "x": 2, "y": 1}, {"z": 2, "x": 1, "y": 3}]
7.dict內嵌套list排序
dic = { "a": [1, 2, 3], "b": [2, 1, 3], "c": [3, 1, 2], } print(sorted(dic, key=lambda k: dic[k][0])) # ["a", "b", "c"] print(sorted(dic, key=lambda k: dic[k][1])) # ["b", "c", "a"] print(sorted(dic, key=lambda k: dic[k][2])) # ["c", "b", "a"] print(sorted(dic, key=lambda k: dic[k][0], reverse=True)) # ["c", "b", "a"]
實例
1、給定一個只包含大小寫字母,數字的字符串,對其進行排序,保證:
所有的小寫字母在大寫字母前面;
所有的字母在數字前面;
所有的奇數在偶數前面;
>>> s = "Sorting1234" >>> "".join(sorted(s, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x))) "ginortS1324"
2、排序一副FranchDeck。流暢的python書中示例
import collections Card = collections.namedtuple("Card", ["rank", "suit"]) #命名元組 class FrenchDeck: ranks = [str(n) for n in range(2, 11)] + list("JQKA") #2到10和JQKA suits = "spades diamonds clubs hearts".split() #split默認按空格生成列表 def __init__(self): self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks] #生成所有52張牌 def __len__(self): return len(self._cards) #可以用Len()方法 def __getitem__(self, position): return self._cards[position] #可以用索引或切片 suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0) #設置花色優先級 def spades_high(card): rank_value = FrenchDeck.ranks.index(card.rank) #找到當前Card所在的索引:2的索引為0 return rank_value * len(suit_values) + suit_values[card.suit] #返回當前牌對應的優先級數字,如果沒有乘于len(suit_values)那么("2", "spades")和("4", "diamonds")的優先級數字就一樣了,這里也可以直接乘于4或5,6.... #排序 >>> import Frenchcard >>> deck = Frenchcard.FrenchDeck() >>> for i in sorted(deck, key=b.spades_high): #sorted返回一個列表。key后的函數會代入deck列表里的每一項返回一個優先級數字,并以這個優先級數字排序 ... print(i) Card(rank="2", suit="clubs") Card(rank="2", suit="diamonds") Card(rank="2", suit="hearts") Card(rank="2", suit="spades") Card(rank="3", suit="clubs") Card(rank="3", suit="diamonds") .............
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43689.html
摘要:下列的所有排序函數都是直接作用于數組本身,而不是返回一個新的有序的數組。倒序并保持索引關系,按鍵名排序按鍵名倒序使用用戶自定義的比較函數對數組中的值進行排序,要排序的數組需要用一種不尋常的標準進行排序,那么應該使用此函數。 數組排序,共13個 函數中有u的,能自定義比較函數;有k的,按照鍵來排序;有r(reverse)的,倒序;有a(association)的,一定是鍵值關聯,除了r...
摘要:歡迎您的支持系列目錄復習資料資料整理個人整理重溫基礎篇重溫基礎對象介紹重溫基礎對象介紹重溫基礎介紹重溫基礎相等性判斷重溫基礎閉包重溫基礎事件本章節復習的是中的高階函數,可以提高我們的開發效率。 本文是 重溫基礎 系列文章的第二十一篇。 今日感受:想家。 本人自己整理的【Cute-JavaScript】資料,包含:【ES6/ES7/ES8/ES9】,【JavaScript基礎...
摘要:也可以直接調用內置方法常用高階函數方法的作用是接收一個函數作為參數,對數組中每個元素按順序調用一次傳入的函數并返回結果,不改變原數組,返回一個新數組。 Ps. 晚上加班到快十點,回來趕緊整理整理這篇文章,今天老大給我推薦了一篇文章,我從寫技術博客中收獲到了什么?- J_Knight_,感受也是很多,自己也需要慢慢養成記錄博客的習慣,即使起步艱難,難以堅持,但還是要讓自己加油加油。 前...
摘要:工作到了這個年數感覺那些基本函數語法已經跟人合一了根本不會為操作一些數據結構而思考半天了在做小程序的時候遇到了個的場景結果發現沒有以為的那么簡單也許是之前不求甚解的原因那么現在來解決的問題問題的產生與探討方向在小程序中有個將的某一條置頂的需 工作到了這個年數, 感覺那些基本函數語法已經跟人合一了, 根本不會為操作一些數據結構而思考半天了. 在做小程序的時候遇到了個orderby的場景,...
摘要:方法參數該有一個可選參數,允許此方法幫助對內容進行排序。例如,在非常大的數組中,可以使用新的方法來獲得更有效的排序函數,而不是使用。在瀏覽器和節點中以全局對象的形式呈現,并具有廣泛的支持包括。 英文原文: 《Usar correctamente el método sort()》 注意:內容有做精簡和調整。 在過去的幾個星期里,我們在不同的團隊中看到,一般來說都沒有使用 Array...
閱讀 1084·2021-10-08 10:04
閱讀 3523·2021-08-05 10:01
閱讀 2278·2019-08-30 11:04
閱讀 1794·2019-08-29 15:29
閱讀 836·2019-08-29 15:12
閱讀 1670·2019-08-26 12:11
閱讀 3115·2019-08-26 11:33
閱讀 1163·2019-08-26 10:23