杨宝生 發表於 2020-3-7 22:18:00

python的deque(双向)队列详解

<p>首先 python的队列有很多种</p>
<p>Python标准库中包含了四种队列,分别是<strong>queue.Queue / asyncio.Queue / multiprocessing.Queue / collections.deque</strong></p>
<p>可见deque是标准库collections中的</p>
<p>这其中最好用的是deque&nbsp;</p>
<p>以下是deque的基本操作:</p>
<p><img src="https://img2020.cnblogs.com/i-beta/1959611/202003/1959611-20200307215621460-1733987446.png"></p>
<p>&nbsp;</p>
<p>它的操作很像list 同时&nbsp;</p>
<div>
<div>相比于list实现的队列,deque实现拥有更低的时间和空间复杂度。list实现在出队(pop)和插入(insert)时的空间复杂度大约为O(n),deque在出队(pop)和入队(append)时的时间复杂度是O(1)。</div>
<div>所以deque更有优越性 而且deque既可以表示队列 又可以表示栈 实在是太方便了</div>
<br><br></div>
<div>下面再介绍几个黑科技:</div>
<div>&nbsp;</div>
<div>deque支持in操作符(真没想到这都支持)</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> q = collections.deque()
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">print</span>(5 <span style="color: rgba(0, 0, 255, 1)">in</span> q)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> False</span>
<span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">print</span>(1 <span style="color: rgba(0, 0, 255, 1)">in</span> q)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> True</span></pre>
</div>
<p>还可以顺逆时针旋转...</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 顺时针</span>
q = collections.deque()
q.rotate(</span>1<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(q)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> </span>
q.rotate(1<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(q)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> </span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 逆时针</span>
q = collections.deque()
q.rotate(</span>-1<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(q)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> </span>
q.rotate(-1<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(q)<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> </span></pre>
</div>
<p>还可以复制一个新队列:</p>
<div class="cnblogs_code">
<pre>&gt;&gt;&gt; d.append(1<span style="color: rgba(0, 0, 0, 1)">)
</span>&gt;&gt;&gt; d.append(2<span style="color: rgba(0, 0, 0, 1)">)
</span>&gt;&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> d
deque([</span>1, 2<span style="color: rgba(0, 0, 0, 1)">])
</span>&gt;&gt;&gt; d1 =<span style="color: rgba(0, 0, 0, 1)"> d.copy()
</span>&gt;&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> d1
deque([</span>1, 2])</pre>
</div>
<p>&nbsp;</p>
</div>
<p><strong>&nbsp;值得注意的是 deque里边的形式是列表形式</strong></p>
<p>&nbsp;</p>
<p>所以 试试extend呢?</p>
<div class="cnblogs_code">
<pre>&gt;&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> d.clear()
</span>&gt;&gt;&gt; d.append(1<span style="color: rgba(0, 0, 0, 1)">)
</span>&gt;&gt;&gt; d.extend()
</span>&gt;&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> d
deque([</span>1, 3, 4, 5])</pre>
</div>
<p>能不能从左边extend呢:</p>
<div class="cnblogs_code">
<pre>&gt;&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> d.clear()
</span>&gt;&gt;&gt; d.append(1<span style="color: rgba(0, 0, 0, 1)">)
</span>&gt;&gt;&gt; d.extendleft()
</span>&gt;&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> d
deque([</span>5, 4, 3, 1])</pre>
</div>
<p>还有index:查找索引位置</p>
<div class="cnblogs_code">
<pre>&gt;&gt;&gt; d.extend([<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">b</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">c</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">d</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">e</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">f</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">])
</span>&gt;&gt;&gt;<span style="color: rgba(0, 0, 0, 1)"> d
deque([</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">a</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">b</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">c</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">d</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">e</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">f</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">])
</span>&gt;&gt;&gt; d.index(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">c</span><span style="color: rgba(128, 0, 0, 1)">"</span>,0,4) <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">指定查找的区间</span>
2
&gt;&gt;&gt; d.index(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">c</span><span style="color: rgba(128, 0, 0, 1)">"</span>,0,2<span style="color: rgba(0, 0, 0, 1)">)
error...</span></pre>
</div>
<p>其他的一些基本操作 还有</p>
<p>d.insert(位置,元素)&nbsp; 在指定位置插入元素</p>
<p>d.remove(元素)&nbsp; &nbsp;删除指定元素</p>
<p>d.reverse&nbsp; &nbsp;队列翻转</p>
<p>&nbsp;</p>
<p>接下来我们做一道面试题:</p>
<p>题目</p>
<p><strong>请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。</strong></p>
<p><strong>若队列为空,pop_front 和 max_value&nbsp;需要返回 -1</strong></p>
<p>输入: <br>["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]<br>[[],,,[],[],[]]<br>输出:&nbsp;</p>
<p>既然时间复杂度是O(1)</p>
<p>我们用deque就好</p>
<p>代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">from</span> collections <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> deque
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> MaxQueue:

    </span><span style="color: rgba(0, 0, 255, 1)">def</span> <span style="color: rgba(128, 0, 128, 1)">__init__</span><span style="color: rgba(0, 0, 0, 1)">(self):
      self.d </span>=<span style="color: rgba(0, 0, 0, 1)"> deque()

    </span><span style="color: rgba(0, 0, 255, 1)">def</span> max_value(self) -&gt;<span style="color: rgba(0, 0, 0, 1)"> int:
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> max(self.d) <span style="color: rgba(0, 0, 255, 1)">if</span> self.d <span style="color: rgba(0, 0, 255, 1)">else</span> -1

    <span style="color: rgba(0, 0, 255, 1)">def</span> push_back(self, value: int) -&gt;<span style="color: rgba(0, 0, 0, 1)"> None:
      self.d.append(value)

    </span><span style="color: rgba(0, 0, 255, 1)">def</span> pop_front(self) -&gt;<span style="color: rgba(0, 0, 0, 1)"> int:
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> self.d.popleft() <span style="color: rgba(0, 0, 255, 1)">if</span> self.d <span style="color: rgba(0, 0, 255, 1)">else</span> -1</pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/ranzhong/p/12438841.html
頁: [1]
查看完整版本: python的deque(双向)队列详解