成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python之排序操作及heapq模塊

dongfangyiyu / 3535人閱讀

摘要:內(nèi)置的模塊接下來我們一一介紹。小伙伴們有沒有想我為何介紹這個(gè)模塊,并且和排序放在一起呢,其實(shí)在很多時(shí)候我們需要找序列中的前幾個(gè)最大值或者最小值,使用此模塊中的方法是最好不過的了。

說到排序,很多人可能第一想到的就是sorted,但是你可能不知道python中其實(shí)還有還就中方法喲,并且好多種場(chǎng)景下效率都會(huì)比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比較進(jìn)行排序,
#數(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é)果進(jìn)行倒序,可用作降序排列
介紹一種比lambda效率高的方式:
operator模塊中的方法itemgetter
>>> itemgetter(1)("ABCDEFG")
"B"
>>> itemgetter(1,3,5)("ABCDEFG")
("B", "D", "F")
>>> itemgetter(slice(2,None))("ABCDEFG")
"CDEFG
運(yùn)用到上述代碼
print(sorted(list3,key=itemgetter("age","price")))    #結(jié)果同上但效率會(huì)比較高

接下來的排序操作涉及到一個(gè)非常重要的一種數(shù)據(jù)結(jié)構(gòu)——堆,不過今天我主要介紹這個(gè)模塊中的方法,具體什么是堆,及其還有一種數(shù)據(jù)結(jié)構(gòu)——棧,有時(shí)間我會(huì)專門寫一篇文章來介紹。
heapq(Python內(nèi)置的模塊)

__all__ = ["heappush", "heappop", "heapify", "heapreplace", "merge",
           "nlargest", "nsmallest", "heappushpop"]

接下來我們一一介紹。
nlargest與nsmallest,通過字面意思可以看出方法大致的作用,接下來動(dòng)手測(cè)驗(yàn)

nlargest(n, iterable, key=None)
nsmallest(n, iterable, key=None)
#n:查找個(gè)數(shù)    iterable:可迭代對(duì)象    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)特點(diǎn):heap[0]永遠(yuǎn)是最小的元素(利用此特性排序)

heapify:對(duì)序列進(jìn)行堆排序,
heappush:在堆序列中添加值
heappop:刪除最小值并返回
heappushpop:添加并刪除堆中最小值且返回,添加之后刪除
heapreplace:添加并刪除隊(duì)中最小值且返回,刪除之后添加

nums=[54,23,64.,323,53,3,212,453,65]
heapify(nums)    #先進(jìn)行堆排序
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:合并多個(gè)序列

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é)果不僅進(jìn)行了合并,還進(jìn)行了排序,有意思哈,可是換個(gè)代碼測(cè)驗(yàn),你再看一下

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]
#你們肯定想這是什么鬼,一點(diǎn)都沒有頭緒,其實(shí)經(jīng)過我的多次測(cè)驗(yàn),還是有規(guī)律的,但是由于沒有什么作用就不大篇幅說明了,喜歡刨根問題的小伙伴可以嘗試自己思考一下。

小伙伴們有沒有想我為何介紹這個(gè)模塊,并且和排序放在一起呢,其實(shí)在很多時(shí)候我們需要找序列中的前幾個(gè)最大值或者最小值,使用此模塊中的方法是最好不過的了。
如果需要全部排序我們使用sorted,需要查找最大或最小的幾個(gè)或者多個(gè)我們使用alargest/asmallest,查找最大最小使用max/min

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42809.html

相關(guān)文章

  • Pythonheapq 模塊源碼分析

    摘要:原文鏈接起步模塊實(shí)現(xiàn)了適用于列表的最小堆排序算法。本文內(nèi)容將分為三個(gè)部分,第一個(gè)部分簡(jiǎn)單介紹模塊的使用第二部分回顧堆排序算法第三部分分析中的實(shí)現(xiàn)??偨Y(jié)堆排序結(jié)合圖來理解還是比較好理解的。 原文鏈接:https://www.hongweipeng.com/i... 起步 heapq 模塊實(shí)現(xiàn)了適用于Python列表的最小堆排序算法。 showImg(https://segmentfaul...

    CoderBear 評(píng)論0 收藏0
  • Python 列表推導(dǎo)優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn)

    摘要:主要介紹列表列表推導(dǎo)有關(guān)的話題,最后演示如何用列表實(shí)現(xiàn)一個(gè)優(yōu)先級(jí)隊(duì)列。笛卡爾積列表推導(dǎo)還可以生成兩個(gè)或以上的可迭代類型的笛卡爾積。兩個(gè)優(yōu)先級(jí)相同的元素和,操作按照它們被插入到隊(duì)列的順序返回。變量的作用是保證同等優(yōu)先級(jí)元素的正確排序。 這一篇是《流暢的 python》讀書筆記。主要介紹列表、列表推導(dǎo)有關(guān)的話題,最后演示如何用列表實(shí)現(xiàn)一個(gè)優(yōu)先級(jí)隊(duì)列。 Python 內(nèi)置序列類型 Pytho...

    darkerXi 評(píng)論0 收藏0
  • Python基礎(chǔ)(十)模塊

    摘要:是回調(diào)函數(shù),當(dāng)鏈接服務(wù)器和相應(yīng)數(shù)據(jù)傳輸完畢時(shí)觸發(fā)本函數(shù)可選。僅僅是針對(duì)的,在中,已經(jīng)沒有這個(gè)模塊了,取代它的是。由于以流式讀取文件,從而速度較快,切少占用內(nèi)存,但是操作上稍復(fù)雜,需要用戶實(shí)現(xiàn)回調(diào)函數(shù)。 編寫模塊 模塊是程序 模塊就是一個(gè)擴(kuò)展名為.py的Python程序。 編寫模塊 #!/usr/bin/env python # coding=utf-8 lang = python 引...

    jlanglang 評(píng)論0 收藏0
  • Python奇遇記:數(shù)據(jù)結(jié)構(gòu)窺探

    摘要:擠掉了堆中實(shí)現(xiàn)了堆排序。你可以用堆排序來查找一個(gè)序列中最大的或者最小的幾個(gè)元素。除了使用堆排序,中還有排序和,這兩個(gè)排序最終生成以列表表示的排序結(jié)果,堆排序也是。 這次我們來說說python中的數(shù)據(jù)結(jié)構(gòu)。當(dāng)然了,不會(huì)講很基礎(chǔ)的內(nèi)容。 用過python的都知道,python有著與其他語(yǔ)言很不一樣的數(shù)據(jù)類型,像什么列表、元組、集合、字典之類。這些數(shù)據(jù)類型造就了python簡(jiǎn)單易用同時(shí)又很強(qiáng)...

    mrli2016 評(píng)論0 收藏0
  • 4-array/heapq/queue模塊

    摘要:定義了一個(gè)非常類似的模塊,其函數(shù)接受兩個(gè)參數(shù),第一個(gè)參數(shù)是預(yù)先定義好的類型,第二個(gè)參數(shù),一般為一個(gè)序列。很少見到代碼輸出是中實(shí)現(xiàn)堆排序的模塊。這里主要看一下優(yōu)先級(jí)隊(duì)列定義優(yōu)先級(jí)比較輸出 array array 定義了一個(gè)非常類似list的模塊,其array 函數(shù)接受兩個(gè)參數(shù),第一個(gè)參數(shù)是預(yù)先定義好的類型,第二個(gè)參數(shù),一般為一個(gè)序列。 很少見到代碼: import array a = ...

    forrest23 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<