摘要:項目地址提供兩種內(nèi)置排序方法,一個是只針對的原地排序方法,另一個是針對所有可迭代對象的非原地排序方法。
項目地址:https://git.io/pytips
Python 提供兩種內(nèi)置排序方法,一個是只針對 List 的原地(in-place)排序方法 list.sort(),另一個是針對所有可迭代對象的非原地排序方法 sorted()。
所謂原地排序是指會立即改變被排序的列表對象,就像 append()/pop() 等方法一樣:
from random import randrange lst = [randrange(1, 100) for _ in range(10)] print(lst) lst.sort() print(lst)
[57, 81, 32, 74, 12, 89, 76, 21, 75, 6] [6, 12, 21, 32, 57, 74, 75, 76, 81, 89]
sorted() 不限于列表,而且會生成并返回一個新的排序后的列表,原有對象不受影響:
lst = [randrange(1, 100) for _ in range(10)] tup = tuple(lst) print(sorted(tup)) # return List print(tup)
[11, 36, 39, 41, 48, 48, 50, 76, 79, 99] (11, 41, 79, 48, 48, 99, 39, 76, 36, 50)
雖然不是原地排序,但如果是傳入生成器,還是會被循環(huán)掉的:
tup = (randrange(1, 100) for _ in range(10)) print(sorted(tup)) for i in tup: print(i)
[5, 12, 15, 21, 57, 69, 73, 83, 90, 95]Key
對簡單的迭代對象進行排序只需要逐次提取元素進行比較即可,如果想要對元素進行一些操作再進行比較,可以通過 key 參數(shù)指定一個取值函數(shù)。這里的 key 用法很像 0x02 函數(shù)式編程提到的 map/filter 所接受的函數(shù),不同之處在于這里的 key 函數(shù)只是在排序比較前對元素進行處理,并不會改變元素原本的值,例如我們對一組整數(shù)按照(key 可以理解為按照的意思)絕對值進行排序:
lst = [randrange(-10, 10) for _ in range(10)] print(lst) print(sorted(lst, key=abs))
[0, 7, 0, -10, 3, 7, -9, -10, -7, -10] [0, 0, 3, 7, 7, -7, -9, -10, -10, -10]
或者,當?shù)鷮ο蟮脑剌^為復雜時,可以只按照其中的某些屬性進行排序:
lst = list(zip("hello world hail python".split(), [randrange(1, 10) for _ in range(4)])) print(lst) print(sorted(lst, key=lambda item: item[1]))
[("hello", 3), ("world", 3), ("hail", 9), ("python", 9)] [("hello", 3), ("world", 3), ("hail", 9), ("python", 9)]
Python 的 operator 標準庫提供了一些操作符相關(guān)的方法,可以更方便地獲取元素的屬性:
from operator import itemgetter, attrgetter print(lst) print(sorted(lst, key=itemgetter(1))) # 一切都只是函數(shù) fitemgetter = lambda ind: lambda item: item[ind] print(sorted(lst, key=fitemgetter(1))) class P(object): def __init__(self, w, n): self.w = w self.n = n def __repr__(self): return "{}=>{}".format(self.w, self.n) ps = [P(i[0], i[1]) for i in lst] print(sorted(ps, key=attrgetter("n")))
[("hello", 3), ("world", 3), ("hail", 9), ("python", 9)] [("hello", 3), ("world", 3), ("hail", 9), ("python", 9)] [("hello", 3), ("world", 3), ("hail", 9), ("python", 9)] [hello=>3, world=>3, hail=>9, python=>9]
經(jīng)過 key 處理之后會通過 < 符號對兩個元素進行比較,在 Python 2.7 的版本中,sorted() 還可以接收另外一個參數(shù) cmp,用來接管 < 的比較過程。但是在 Python 3.5 中已經(jīng)全面摒棄了這一做法,包括 sorted() 中的 cmp 參數(shù)和對象中的 __cmp__ 比較操作,只有在需要向后兼容的時候才可能在 Python 3.5 用到這一功能,其替換的方法為:
from functools import cmp_to_key as new_cmp_to_key # new_cmp_to_key works like this def cmp_to_key(mycmp): "Convert a cmp= function into a key= function" class K: def __init__(self, obj, *args): self.obj = obj def __lt__(self, other): return mycmp(self.obj, other.obj) < 0 return K def reverse_cmp(x, y): return y[1] - x[1] sorted(lst, key=cmp_to_key(reverse_cmp))
[("hail", 9), ("python", 9), ("hello", 3), ("world", 3)]
如果想要按照遞減排序,只需要設(shè)定參數(shù) reverse = True 即可。
歡迎關(guān)注公眾號 PyHub!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/37843.html
摘要:項目地址迭代器與生成器迭代器與生成器是中比較常用又很容易混淆的兩個概念,今天就把它們梳理一遍,并舉一些常用的例子。生成器前面說到創(chuàng)建迭代器有種方法,其中第三種就是生成器。 項目地址:https://git.io/pytips 迭代器與生成器 迭代器(iterator)與生成器(generator)是 Python 中比較常用又很容易混淆的兩個概念,今天就把它們梳理一遍,并舉一些常用的例...
摘要:借鑒了中的某些迭代器的構(gòu)造方法,并在中實現(xiàn)該模塊是通過實現(xiàn),源代碼。 項目地址:https://git.io/pytips 0x01 介紹了迭代器的概念,即定義了 __iter__() 和 __next__() 方法的對象,或者通過 yield 簡化定義的可迭代對象,而在一些函數(shù)式編程語言(見 0x02 Python 中的函數(shù)式編程)中,類似的迭代器常被用于產(chǎn)生特定格式的列表(或序列)...
摘要:可以通過一個簡單的例子來展示當然,也可以用狀態(tài)變量的做法來替代總結(jié)有人覺得的這些用法違反直覺或者是而非,不值得提倡。 項目地址:https://git.io/pytips 我們都知道 Python 中 else 的基本用法是在條件控制語句中的 if...elif...else...,但是 else 還有兩個其它的用途,一是用于循環(huán)的結(jié)尾,另一個是用在錯誤處理的 try 中。這原本是 P...
摘要:項目地址本篇主要關(guān)于三個常用內(nèi)置方法,,在語言的設(shè)計中,通常的語法操作最終都會轉(zhuǎn)化為方法調(diào)用,例如相當于中的描述符就是將對象屬性的獲取賦值以及刪除等行為轉(zhuǎn)換為方法調(diào)用的協(xié)議例如我們要獲取一個對象的屬性,可以通過的方式取得而通過的 項目地址:https://git.io/pytips 本篇主要關(guān)于三個常用內(nèi)置方法:property(),staticmethod(),classmethod...
摘要:項目地址中內(nèi)置的庫和分別提供了堆和優(yōu)先隊列結(jié)構(gòu),其中優(yōu)先隊列本身也是基于實現(xiàn)的,因此我們這次重點看一下。堆可以用于實現(xiàn)調(diào)度器例見之協(xié)程,更常用的是優(yōu)先隊列例如。 項目地址:https://git.io/pytips Python 中內(nèi)置的 heapq 庫和 queue 分別提供了堆和優(yōu)先隊列結(jié)構(gòu),其中優(yōu)先隊列 queue.PriorityQueue 本身也是基于 heapq 實現(xiàn)的,因...
閱讀 1824·2023-04-26 01:55
閱讀 1088·2021-09-30 09:47
閱讀 1683·2019-08-30 15:54
閱讀 749·2019-08-30 15:53
閱讀 701·2019-08-30 15:52
閱讀 1144·2019-08-30 15:44
閱讀 2418·2019-08-30 14:06
閱讀 1066·2019-08-29 16:39