詳解Python的collections模塊中的deque雙端隊(duì)列結(jié)構(gòu)
deque 是 double-ended queue的縮寫,類似于 list,不過提供了在兩端插入和刪除的操作。
- appendleft 在列表左側(cè)插入
- popleft 彈出列表左側(cè)的值
- extendleft 在左側(cè)擴(kuò)展
例如:
queue = deque() # append values to wait for processing queue.appendleft("first") queue.appendleft("second") queue.appendleft("third") # pop values when ready process(queue.pop()) # would process "first" # add values while processing queue.appendleft("fourth") # what does the queue look like now? queue # deque(['fourth', 'third', 'second'])
作為一個(gè)雙端隊(duì)列,deque還提供了一些其他的好用方法,比如 rotate 等,下面我們一起來看一下:
填充
deque可以從任意一端填充,在python實(shí)現(xiàn)稱為“左端”和“右端”。
import collections d1 = collections.deque() d1.extend('abcdefg') print 'extend:', d1 d1.append('h') print 'append:', d1 d2 = collections.deque() d2.extendleft(xrange(6)) print 'extendleft', d2 d2.appendleft(6) print 'appendleft', d2
extendleft()迭代處理其輸入,對每個(gè)元素完成與appendleft()相同的處理。
extend: deque(['a', 'b', 'c', 'd', 'e', 'f', 'g']) append: deque(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']) extendleft deque([5, 4, 3, 2, 1, 0]) appendleft deque([6, 5, 4, 3, 2, 1, 0])
利用
可以從兩端利用deque元素,取決于應(yīng)用的算法。
import collections print "From the right:" d = collections.deque('abcdefg') while True: try: print d.pop(), except IndexError: break print print "\nFrom the left:" d = collections.deque(xrange(6)) while True: try: print d.popleft(), except IndexError: break print
使用pop()可以從deque右端刪除一個(gè)元素,使用popleft()可以從deque左端刪除一個(gè)元素。
From the right: g f e d c b a From the left: 0 1 2 3 4 5
由于雙端隊(duì)列是線程安全的,可以在不同的線程中同時(shí)從兩端利用隊(duì)列的內(nèi)容。
import collections import threading import time candle = collections.deque(xrange(5)) def burn(direction, nextSource): while True: try: next = nextSource() except IndexError: break else: print '%8s: %s' % (direction, next) time.sleep(0.1) print '%8s done' % direction return left = threading.Thread(target=burn, args=('Left', candle.popleft)) right = threading.Thread(target=burn, args=('Right', candle.pop)) left.start() right.start() left.join() right.join()
線程交替處理兩端,刪除元素,知道這個(gè)deque為空。
Left: 0 Right: 4 Right: 3 Left: 1 Right: 2 Left done Right done
旋轉(zhuǎn)
deque另外一個(gè)作用可以按照任意一個(gè)方向旋轉(zhuǎn),而跳過一些元素。
import collections d = collections.deque(xrange(10)) print 'Normal:', d d= collections.deque(xrange(10)) d.rotate(2) print 'Right roration:', d d = collections.deque(xrange(10)) d.rotate(-2) print 'Left roration:', d
結(jié)果:
Normal: deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) Right roration: deque([8, 9, 0, 1, 2, 3, 4, 5, 6, 7]) Left roration: deque([2, 3, 4, 5, 6, 7, 8, 9, 0, 1])
再舉個(gè)例子:
# -*- coding: utf-8 -*- """ 下面這個(gè)是一個(gè)有趣的例子,主要使用了deque的rotate方法來實(shí)現(xiàn)了一個(gè)無限循環(huán) 的加載動(dòng)畫 """ import sys import time from collections import deque fancy_loading = deque('>--------------------') while True: print '\r%s' % ''.join(fancy_loading), fancy_loading.rotate(1) sys.stdout.flush() time.sleep(0.08)
輸出結(jié)果:
# 一個(gè)無盡循環(huán)的跑馬燈 ------------->-------
相關(guān)文章
如何使用Python實(shí)現(xiàn)斐波那契數(shù)列
這篇文章主要介紹了如何使用Python實(shí)現(xiàn)斐波那契數(shù)列,斐波那契數(shù)列(Fibonacci)最早由印度數(shù)學(xué)家Gopala提出,而第一個(gè)真正研究斐波那契數(shù)列的是意大利數(shù)學(xué)家 Leonardo Fibonacci,需要的朋友可以參考下2019-07-07Pandas中df.loc[]與df.iloc[]的用法與異同?
本文主要介紹了Pandas中df.loc[]與df.iloc[]的用法與異同,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧?2022-07-07Python如何使用帶有?for?循環(huán)的?Lambda?函數(shù)
這篇文章主要介紹了如何在?Python?中使用帶有?for?循環(huán)的?Lambda?函數(shù),使用?Lambda?函數(shù)配合?for?循環(huán)可以讓代碼變得更加簡潔,但需要注意的是,Lambda?函數(shù)在語法上有一些限制,如果需要更復(fù)雜的邏輯,還需要使用普通函數(shù),感興趣的朋友跟隨小編一起學(xué)習(xí)吧2023-05-05Python人工智能深度學(xué)習(xí)模型訓(xùn)練經(jīng)驗(yàn)總結(jié)
這篇文章主要為大家介紹了Python人工智能深度學(xué)習(xí)模型訓(xùn)練的經(jīng)驗(yàn)總結(jié)及建議,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11pyqt5之將textBrowser的內(nèi)容寫入txt文檔的方法
今天小編就為大家分享一篇pyqt5之將textBrowser的內(nèi)容寫入txt文檔的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06使用TensorFlow搭建一個(gè)全連接神經(jīng)網(wǎng)絡(luò)教程
今天小編就為大家分享一篇使用TensorFlow搭建一個(gè)全連接神經(jīng)網(wǎng)絡(luò)教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02