摘要:內(nèi)置的模塊接下來我們一一介紹。小伙伴們有沒有想我為何介紹這個模塊,并且和排序放在一起呢,其實在很多時候我們需要找序列中的前幾個最大值或者最小值,使用此模塊中的方法是最好不過的了。
說到排序,很多人可能第一想到的就是sorted,但是你可能不知道python中其實還有還就中方法喲,并且好多種場景下效率都會比sorted高。那么接下來我就依次來介紹我所知道的排序操作。
sorted(iterable, *, key=None, reverse=False)
list1=[1,6,4,3,9,5] list2=["12","a6","4","c34","b9","5"] print(sorted(list1)) #[1, 3, 4, 5, 6, 9] print(sorted(list2)) #["12", "4", "5", "a6", "b9", "c34"] #總結(jié)上面兩種排序:字符串排序根據(jù)元素首字符的ASCII比較進行排序, #數(shù)字類型按照大小排序,數(shù)字不能混合排序 list3=[ {"name":"jim","age":23,"price":500}, {"name":"mase","age":23,"price":600}, {"name":"tom","age":25,"price":2000}, {"name":"alice","age":22,"price":300}, {"name":"rose","age":21,"price":2400}, ] print(sorted(list3,key=lambda s:(s["age"],s["price"]))) #[{"name": "rose", "age": 21, "price": 2400}, {"name": "alice", "age": 22, "price": 300}, {"name": "jim", "age": 23, "price": 500}, {"name": "mase", "age": 23, "price": 600}, {"name": "tom", "age": 25, "price": 2000}] 最后的reverse參數(shù)我就不作說明了,就是把結(jié)果進行倒序,可用作降序排列 介紹一種比lambda效率高的方式: operator模塊中的方法itemgetter >>> itemgetter(1)("ABCDEFG") "B" >>> itemgetter(1,3,5)("ABCDEFG") ("B", "D", "F") >>> itemgetter(slice(2,None))("ABCDEFG") "CDEFG 運用到上述代碼 print(sorted(list3,key=itemgetter("age","price"))) #結(jié)果同上但效率會比較高
接下來的排序操作涉及到一個非常重要的一種數(shù)據(jù)結(jié)構(gòu)——堆,不過今天我主要介紹這個模塊中的方法,具體什么是堆,及其還有一種數(shù)據(jù)結(jié)構(gòu)——棧,有時間我會專門寫一篇文章來介紹。
heapq(Python內(nèi)置的模塊)
__all__ = ["heappush", "heappop", "heapify", "heapreplace", "merge", "nlargest", "nsmallest", "heappushpop"]
接下來我們一一介紹。
nlargest與nsmallest,通過字面意思可以看出方法大致的作用,接下來動手測驗
nlargest(n, iterable, key=None) nsmallest(n, iterable, key=None) #n:查找個數(shù) iterable:可迭代對象 key:同sorted list1=[1,6,4,3,9,5] list2=["12","a6","4","c34","b9","5"] list3=[ {"name":"jim","age":23,"price":500}, {"name":"mase","age":23,"price":600}, {"name":"tom","age":25,"price":2000}, {"name":"alice","age":22,"price":300}, {"name":"rose","age":21,"price":2400}, ] from operator import itemgetter import heapq print(heapq.nlargest(len(list1),list1)) print(heapq.nlargest(len(list2),list2)) print(heapq.nlargest(len(list3),list3,key=itemgetter("age","price"))) #以上代碼輸出結(jié)果同sorted print(heapq.nsmallest(len(list1),list1)) print(heapq.nsmallest(len(list2),list2)) print(heapq.nsmallest(len(list3),list3,key=itemgetter("age","price"))) #結(jié)果是降序 [1, 3, 4, 5, 6, 9] ["12", "4", "5", "a6", "b9", "c34"] [{"name": "rose", "age": 21, "price": 2400}, {"name": "alice", "age": 22, "price": 300}, {"name": "jim", "age": 23, "price": 500}, {"name": "mase", "age": 23, "price": 600}, {"name": "tom", "age": 25, "price": 2000}]
heappush,heappop,heapify,heapreplace,heappushpop
堆結(jié)構(gòu)特點:heap[0]永遠是最小的元素(利用此特性排序)
heapify:對序列進行堆排序, heappush:在堆序列中添加值 heappop:刪除最小值并返回 heappushpop:添加并刪除堆中最小值且返回,添加之后刪除 heapreplace:添加并刪除隊中最小值且返回,刪除之后添加 nums=[54,23,64.,323,53,3,212,453,65] heapify(nums) #先進行堆排序 print(heappop(nums)) #3 print(heappush(nums,50)) #添加操作,返回None print(heappushpop(nums,10)) #由于是添加后刪除,所以返回10 print(heappop(nums)) #23 print(heapreplace(nums,10)) #和heappushpop,返回50 print(nums) #[10, 53, 54, 65, 323, 64.0, 212, 453]
merge:合并多個序列
list1 = [1, 2, 3, 4, 5, 12] set1 = {2, 3, 9, 23, 54} s = list(merge(list1,set1)) print(s) #[1, 2, 2, 3, 3, 4, 5, 9, 12, 54, 23] #發(fā)現(xiàn)輸出結(jié)果不僅進行了合并,還進行了排序,有意思哈,可是換個代碼測驗,你再看一下 list1 = [31, 2, 83, 24, 5, 12] set1 = {2, 83, 9, 23, 54} s = list(merge(list1,set1)) print(s) #[2, 9, 31, 2, 83, 24, 5, 12, 83, 54, 23] #你們肯定想這是什么鬼,一點都沒有頭緒,其實經(jīng)過我的多次測驗,還是有規(guī)律的,但是由于沒有什么作用就不大篇幅說明了,喜歡刨根問題的小伙伴可以嘗試自己思考一下。
小伙伴們有沒有想我為何介紹這個模塊,并且和排序放在一起呢,其實在很多時候我們需要找序列中的前幾個最大值或者最小值,使用此模塊中的方法是最好不過的了。
如果需要全部排序我們使用sorted,需要查找最大或最小的幾個或者多個我們使用alargest/asmallest,查找最大最小使用max/min
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/42809.html
摘要:原文鏈接起步模塊實現(xiàn)了適用于列表的最小堆排序算法。本文內(nèi)容將分為三個部分,第一個部分簡單介紹模塊的使用第二部分回顧堆排序算法第三部分分析中的實現(xiàn)。總結(jié)堆排序結(jié)合圖來理解還是比較好理解的。 原文鏈接:https://www.hongweipeng.com/i... 起步 heapq 模塊實現(xiàn)了適用于Python列表的最小堆排序算法。 showImg(https://segmentfaul...
摘要:主要介紹列表列表推導(dǎo)有關(guān)的話題,最后演示如何用列表實現(xiàn)一個優(yōu)先級隊列。笛卡爾積列表推導(dǎo)還可以生成兩個或以上的可迭代類型的笛卡爾積。兩個優(yōu)先級相同的元素和,操作按照它們被插入到隊列的順序返回。變量的作用是保證同等優(yōu)先級元素的正確排序。 這一篇是《流暢的 python》讀書筆記。主要介紹列表、列表推導(dǎo)有關(guān)的話題,最后演示如何用列表實現(xiàn)一個優(yōu)先級隊列。 Python 內(nèi)置序列類型 Pytho...
摘要:是回調(diào)函數(shù),當(dāng)鏈接服務(wù)器和相應(yīng)數(shù)據(jù)傳輸完畢時觸發(fā)本函數(shù)可選。僅僅是針對的,在中,已經(jīng)沒有這個模塊了,取代它的是。由于以流式讀取文件,從而速度較快,切少占用內(nèi)存,但是操作上稍復(fù)雜,需要用戶實現(xiàn)回調(diào)函數(shù)。 編寫模塊 模塊是程序 模塊就是一個擴展名為.py的Python程序。 編寫模塊 #!/usr/bin/env python # coding=utf-8 lang = python 引...
摘要:擠掉了堆中實現(xiàn)了堆排序。你可以用堆排序來查找一個序列中最大的或者最小的幾個元素。除了使用堆排序,中還有排序和,這兩個排序最終生成以列表表示的排序結(jié)果,堆排序也是。 這次我們來說說python中的數(shù)據(jù)結(jié)構(gòu)。當(dāng)然了,不會講很基礎(chǔ)的內(nèi)容。 用過python的都知道,python有著與其他語言很不一樣的數(shù)據(jù)類型,像什么列表、元組、集合、字典之類。這些數(shù)據(jù)類型造就了python簡單易用同時又很強...
摘要:定義了一個非常類似的模塊,其函數(shù)接受兩個參數(shù),第一個參數(shù)是預(yù)先定義好的類型,第二個參數(shù),一般為一個序列。很少見到代碼輸出是中實現(xiàn)堆排序的模塊。這里主要看一下優(yōu)先級隊列定義優(yōu)先級比較輸出 array array 定義了一個非常類似list的模塊,其array 函數(shù)接受兩個參數(shù),第一個參數(shù)是預(yù)先定義好的類型,第二個參數(shù),一般為一個序列。 很少見到代碼: import array a = ...
閱讀 3685·2021-11-25 09:43
閱讀 2645·2021-11-25 09:43
閱讀 3844·2021-11-24 09:38
閱讀 697·2021-11-18 10:02
閱讀 2237·2021-09-22 15:53
閱讀 2998·2019-08-30 15:44
閱讀 2774·2019-08-30 14:01
閱讀 2754·2019-08-29 15:15