deque 是 double-ended queue的縮寫,類似於 list,不過提供了在兩端插入和刪除的操作。
- appendleft 在列表左側插入
- popleft 彈出列表左側的值
- extendleft 在左側擴展
例如:
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"jb51code">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', d2extendleft()叠代處理其輸入,對每個元素完成與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元素,取決於應用的算法。
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右端刪除一個元素,使用popleft()可以從deque左端刪除一個元素。
From the right: g f e d c b a From the left: 0 1 2 3 4 5由於雙端隊列是線程安全的,可以在不同的線程中同時從兩端利用隊列的內容。
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()線程交替處理兩端,刪除元素,知道這個deque為空。
Left: 0 Right: 4 Right: 3 Left: 1 Right: 2 Left done Right done旋轉
deque另外一個作用可以按照任意一個方向旋轉,而跳過一些元素。
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結果:
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])再舉個例子:
# -*- coding: utf-8 -*- """ 下面這個是一個有趣的例子,主要使用了deque的rotate方法來實現了一個無限循環 的加載動畫 """ 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)輸出結果:
# 一個無盡循環的跑馬燈 ------------->-------
Tags: abcdefg process except import second文章來源: