python中PriorityQueue的使用及說明
PriorityQueue是優(yōu)先級(jí)隊(duì)列
越小的優(yōu)先級(jí)越高,會(huì)被先取出。
下面的代碼運(yùn)行正常。
# 示例1 tsq = queue.PriorityQueue() tsq.put_nowait((0, '123', ['abc', 'efg'], 0)) tsq.put_nowait((0, '456', ['abc'], 0))
下面的代碼運(yùn)行報(bào)錯(cuò)。
# 示例2
tsq = queue.PriorityQueue()
tsq.put_nowait((0, '123', {"name":'abc', "age":'efg'}, 0))
tsq.put_nowait((0, '123', {"name":'abc'}, 0))
原因
PriorityQueue是優(yōu)先級(jí)隊(duì)列,優(yōu)先級(jí)排序使用了堆排序,這一操作會(huì)對(duì)壓入的元素進(jìn)行比較。
示例2中壓入的元素是tuple,兩個(gè)tuple相比較是將tuple中元素逐個(gè)比較。
示例2中壓入的兩個(gè)tuple的前兩個(gè)元素都相同,第三個(gè)元素{"name":'abc', "age":'efg'}和{"name":'abc'}都是字典,字典是不能比較大小的。
會(huì)報(bào)錯(cuò)
TypeError: '<' not supported between instances of 'dict' and 'dict'
PriorityQueue的正確使用方式,應(yīng)該是如下兩種,使用tuple的第一個(gè)元素作為優(yōu)先級(jí)數(shù)字,或者自定義類中重定義__lt__方法,使得類實(shí)例能夠相互比較。
# 示例3
tsq = queue.PriorityQueue()
tsq.put_nowait((0,{'task_name': 'aaa'})) # tuple包含兩個(gè)元素,第一個(gè)是優(yōu)先級(jí),第二個(gè)是數(shù)據(jù)
tsq.put_nowait((1, {'task_name', 'bbbb'}))
# 示例4
import queue
class Task(object):
def __init__(self, priority, name):
self.priority = priority
self.name = name
def __str__(self):
return "Task(priority={p}, name={n})".format(p=self.priority, n=self.name)
def __lt__(self, other):
""" 定義<比較操作符。 """
return self.priority < other.priority
tsq = queue.PriorityQueue()
tsq.put_nowait(Task(3, "task1")) # 自定義的類定義了__lt__, 可以比較大小
tsq.put_nowait(Task(1, "task2"))
print(tsq.get()) # return: Task(priory=1, name=task2)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Python的循環(huán)結(jié)構(gòu)知識(shí)點(diǎn)
在本篇文章里小編給大家分享了關(guān)于Python循環(huán)結(jié)構(gòu)的相關(guān)知識(shí)點(diǎn)總結(jié)內(nèi)容,需要的朋友們跟著學(xué)習(xí)下吧。2019-05-05
這篇文章主要介紹了如何在 Python 中導(dǎo)入文本文件,在Python中導(dǎo)入文本文件是很常見的操作,我們可以使用內(nèi)置的open函數(shù)和with語(yǔ)句來讀取或?qū)懭胛谋疚募枰呐笥芽梢詤⒖枷?/div> 2023-05-05
Python字符串通過''+''和join函數(shù)拼接新字符串的性能測(cè)試比較
今天小編就為大家分享一篇關(guān)于Python字符串通過'+'和join函數(shù)拼接新字符串的性能測(cè)試比較,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
使用python-docx和win32com庫(kù)實(shí)現(xiàn)批量轉(zhuǎn)換doc文件為docx文件
這篇文章主要為大家詳細(xì)介紹了使用python-docx和win32com庫(kù)實(shí)現(xiàn)批量轉(zhuǎn)換doc文件為docx文件的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2025-12-12
在python中實(shí)現(xiàn)導(dǎo)入一個(gè)需要傳參的模塊
這篇文章主要介紹了在python中實(shí)現(xiàn)導(dǎo)入一個(gè)需要傳參的模塊,具有很好的參考價(jià)值,希望可以給大家一個(gè)參考,以后在遇到這種的情況的時(shí)候,知道如何應(yīng)對(duì)2021-05-05
python反編譯學(xué)習(xí)之字節(jié)碼詳解
這篇文章主要給大家介紹了關(guān)于python反編譯學(xué)習(xí)之字節(jié)碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Python利用wxPython制作一個(gè)有趣的驗(yàn)證碼生成器
這篇文章主要為大家詳細(xì)介紹了Python如何利用wxPython制作一個(gè)簡(jiǎn)單有趣的驗(yàn)證碼生成器,文中的示例代碼講解詳細(xì),需要的小伙伴可以了解一下2023-04-04
Python OpenCV實(shí)現(xiàn)視頻追蹤
這篇文章主要為大家詳細(xì)介紹了Python OpenCV實(shí)現(xiàn)視頻追蹤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08最新評(píng)論

