2013-03-02 5 views
7

이 동작이 필요하지만 증가하는 목록보다는 오히려 축소 목록이 있습니다. 시퀀스 작업 순서가 중요합니다.반복하는 동안 목록에 추가

for item in mylist: 
    if is_item_mature(item): 
     ## Process him 
    else: 
     ## Check again later 
     mylist.append(item) 

그러나 나는 이것을 더 좋아할 것입니다. 내가 생각하는 것처럼 행동합니까? 더 좋은 방법?

while mylist: 
    item = list.pop(0) 
    if is_item_mature(item): 
     ##Process 
    else: 
     mylist.append(item) 
+1

'list'는 좋은 변수 이름이 아닙니다. –

+0

예, 생각했던 것처럼 동작합니다. 그러나 당신이 기대했던 것처럼 작동합니까? –

+0

모든 것이 잘된 것 같지만, 마지막 항목 중 일부에 장애가 발생했습니다 (데이터 세트의 일부가 잘못됨). 디버거가 꼬리를 따라 잡은 큐를 잡았습니다. – user2097818

답변

6

나는 당신의 접근 방식과 함께 볼 수있는 유일한 문제는 사용량에 따라하는 것은 내가 아니라 당신이 Queue를 사용하는 것이 좋습니다 것입니다

메모리를 먹을 수있다 성장 목록입니다. 대기열은 끝난 제작과 소비 모두를 처리 할 수 ​​있도록 설계되고 융통성이 있습니다.

from Queue import Queue 
q = Queue() #You can also specify the maximum size of the Queue here 
# Assume your Queue was filled 
while not q.empty(): 
    # It won;t block if there are no items to pop 
    item = q.get(block = False) 
    if is_item_mature(item): 
     #process 
    else: 
     #In case your Queue has a maxsize, consider making it non blocking 
     q.put(item) 
+0

+1 대기열이 있습니다! 좋은 예도 역시 –

+0

나는 이것도 좋아한다고 생각한다. 내 루프 처리는 현재 약간 비쌉니다. 엄격한 시퀀싱을 사용하면 당분간 몇 가지 추가 코드가 필요 없게됩니다. – user2097818

+0

'Queue.Queue'는 멀티 스레딩을위한 것입니다. 이것을 필요로하지 않는다면, 단지'queues.deque'를 사용하십시오. 이것은 내부적으로 Queue에 의해 사용됩니다. – koddo

5

당신은 안전하게 목록에 항목을 추가 할 수 있으며, 반복은 해당 항목이 포함됩니다 : 당신이 감소하는 목록을 선호하는 경우, 다음 while 루프는 사용자의 요구에 완벽하게 적합합니다, 그러나

>>> lst = range(5) 
>>> for i in lst: 
...  print i 
...  if i < 3: 
...   lst.append(i + 10) 
... 
0 
1 
2 
3 
4 
10 
11 
12 

을 .

+0

이것이 안전하고 어떻게 작동하는지 어떻게 알 수 있습니까? 그것이 어딘가에 기록되어 있습니까? 나는 이것을 오랫동안 증명하려고 노력해 왔습니다 ... –

+0

@StefanPochmann : 어떻게 알 수 있습니까? 목록의 경험과 지식 및 반복자 구현 세부 정보 나열 명시 적으로 문서화되지 않았습니다. –

+0

@StefanPochmann :'iter (list)'에 의해 반환 된리스트 반복자는 현재 위치 (정수)와리스트에 대한 참조를 저장합니다. 다음 요소를 가져올 때마다 현재 위치 크기가 현재 목록 크기와 비교되고 현재 위치가 작 으면 현재 위치의 항목이 목록에서 검색되고 위치가 증가되며 검색된 항목이 반환됩니다. –

관련 문제