2014-02-07 13 views

Antwort

0

Sie können eine Liste als Warteschlange verwenden. Wenn Sie eine Fifo-Warteschlange wünschen, verwenden Sie einfach .append() zum Hinzufügen und .pop(0) zum Entfernen. Für eine Lifo-Warteschlange (d. H. Einen Stapel) verwenden Sie .append() zum Hinzufügen und .pop() zum Entfernen.

Sie sollten collections.deque verwenden, wenn Sie eine Fifo-Queue implementieren, die speziell für diesen Zweck entwickelt wurde. .pop(0) ist eine O (n) -Operation. Eine Liste als Stapel zu verwenden ist in Ordnung.

FIFO Queue:

In [1]: q = range(15) 
In [2]: q.pop(0) 
Out[2]: 0 

In [3]: q.pop(0) 
Out[3]: 1 

In [4]: q.pop(0) 
Out[4]: 2 

LIFO-Warteschlange:

In [5]: q = range(10) 

In [6]: q.pop() 
Out[6]: 9 

In [7]: q.pop() 
Out[7]: 8 

In [8]: q.pop() 
Out[8]: 7 
+0

list_.pop (0) ist langsam für große Listen. – dstromberg

+0

@dstromberg Ich glaube, es ist in meiner Antwort enthalten. – msvalkon

1

nur pop()

>>> x = [1,2,3] 
>>> x.pop(0) 
1 
>>> x 
[2,3] 
+0

es langsam ist, muss jedes Element verschoben werden –

9

Pop von der Vorderseite einer Liste verwendet, ist nicht sehr effizient, da alle Referenzen in Die Liste muss aktualisiert werden.

deque ermöglicht es Ihnen, wie Operationen

>>> from collections import deque 
>>> deque([1,2,3,4]) 
deque([1, 2, 3, 4]) 
+1

Also könnte ich eine Liste in die Warteschlange machen, indem Sie a = Queue (list1) und dann eine für jede weitere Warteschlangenreferenz verwenden? – rggod

+0

ja. deque wird mit einem iterablen, welches eine Liste ist, initialisiert und unterstützt meistens alle Operationen, die eine normale Liste hätte. Für eine vollständige Liste, siehe Link in der Antwort. – Cilyan

1

collections.deque effizient tun Warteschlange ist die Standard-Antwort, obwohl es nicht sehr gut abstrahiert wird.

Es gibt auch https://pypi.python.org/pypi/linked_list_mod/, wenn Sie bereit sind, ein wenig Geschwindigkeit für eine bessere Abstraktion zu opfern. collections.deque ist schneller. linked_list_mod lässt Sie ein iterable an den Konstruktor übergeben; die mitgelieferten lifo- und fifo-Module tun dies nicht, könnten aber auch dazu modifiziert werden.

1

Da ich eine Antwort auf diese Frage bei der Verwendung queue.Queue suchte, dachte ich, ich sollte meine Erkenntnisse teilen. Es ist möglich, eine Liste unter Verwendung von queue.queue in eine Warteschlange zu konvertieren.

import queue 

l = [i for i in range(1000)] 

q = queue.Queue() 
[q.put(i) for i in l] 

q2 = queue.Queue() 
q2.queue = queue.deque(l) 

Nachdem dieser Code ausgeführt wurde, q und q2 sind zwei verschiedene Warteschlangen, die exakt die gleichen Einträge enthalten, aber mit der zweiten Methode ist> 300-mal schneller auf meinem Rechner.

Nicht verwandt mit der Frage, aber das Gegenteil kann von l = list(q.queue) getan werden, wenn q eine Instanz von queue.Queue ist. Hoffe das erspart dir Ärger!

Dies wurde alles in Python 3.5.2 getestet.

Verwandte Themen