2014-02-07 3 views

답변

0

목록을 대기열로 사용할 수 있습니다. fifo 대기열을 원하면 .append()을 추가하고 .pop(0)을 제거하면됩니다. 라이프 큐 (예 : 스택)의 경우 추가하려면 .append()을, 제거하려면 .pop()을 사용하십시오.

이 목적으로 특별히 설계된 FIFO를 구현할 때는 collections.deque을 사용해야합니다. .pop(0)은 O (n) 연산입니다. 목록을 스택으로 사용하는 것은 괜찮습니다.

FIFO 큐 :

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 큐 :

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)이 느립니다. – dstromberg

+0

@dstromberg 나는 그것이 내 대답에 내포되어 있다고 믿는다. – msvalkon

1

단지리스트의 전면에서 pop()

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

그것의 천천히, 모든 요소는 왼쪽으로 이동해야합니다. –

9

팝업을 사용하는 모든 참조 매우 효율적이지 않다 목록을 업데이트해야합니다.

deque 그것이 정말 잘 추출되지 비록 효율적으로

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

그래서 Queue (list1)를 수행하여 대기열에 목록을 만들 수 있습니다. 그리고 어떤 추가 대기열 참조에도 사용할 수 있습니까? – rggod

+0

예. deque는리스트가되는 iterable로 초기화되고, 보통리스트가하는 모든 연산을 지원합니다. 전체 목록은 답변의 링크를 참조하십시오. – Cilyan

1

collections.deque 표준 대답은, 당신이 작업처럼 대기 할 수 있습니다.

더 나은 추상화를 위해 약간의 속도를 희생하려는 경우에도 https://pypi.python.org/pypi/linked_list_mod/이 있습니다. collections.deque가 빠릅니다. linked_list_mod를 사용하면 반복자를 생성자에 전달할 수 있습니다. 제공된 lifo 및 fifo 모듈은 그렇지 않지만 쉽게 수정 될 수 있습니다.

1

queue.Queue을 사용하면서이 질문에 대한 답변을 찾고 있었기 때문에 제 연구 결과를 공유해야한다고 생각했습니다. queue.queue을 사용하여 목록을 대기열로 변환 할 수 있습니다. 이 코드를 실행 한 후

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) 

, qq2는 동일한 항목을 포함 두 개의 서로 다른 큐하지만, 300 배 빠른 내 컴퓨터에있는 두 번째 방법>으로.

qqueue.Queue 인 경우 질문에 해당하지 않지만 그 반대는 l = list(q.queue)으로 수행 할 수 있습니다. 희망이 당신에게 몇 가지 문제를 절약 할 수 있습니다!

이것은 모두 파이썬 3.5.2에서 테스트되었습니다.

관련 문제