2017-11-24 2 views
0

저는 python을 처음 접했고 큐를 반복 할 때 이상한 오류를 발견했습니다.파이썬에서 객체를 포함하는 큐를 반복합니다.

는 여기에 코드입니다 :

frontier = q.PriorityQueue() 

    for goal in goals: 
     portals = findPortals(maze) 
     comb_value = heuristic(startX, startY, goal[0], goal[1]) 
     frontier.put_nowait((comb_value, heuristic(startX, startY, goal[0], goal[1]), 0, startX, startY, startX, startY)) 

     for portal in portals: 
      heur = portalHeuristic(maze, startX, startY, goal[0], goal[1]) 
      frontier.put_nowait((heur, heur, 0, startX, startY, startX, startY)) 

    for elem in list(frontier): 
     print(elem) 

TypeError: 'PriorityQueue' object is not iterable 말한다 요소를 인쇄하려고합니다. 어떻게 든이 문제를 해결할 수 있습니까? 여기에 몇 가지 해결책을 찾으려고했지만 이해할 수있는 것을 찾지 못했습니다.

+0

우선 순위 큐가하는 일을 완전히 이해하지 못하는 것처럼 들릴 수 있습니다. 일반적으로 힙 (heap)이 아니며 링크 된 목록이 아닙니다. 즉, 맨 위에있는 요소를 제외하고는 순서가 없습니다. –

+0

이 [PriorityQueue] (https://docs.python.org/3/library/queue.html#queue.PriorityQueue)를 사용하고 있습니까? –

+0

또한 https://stackoverflow.com/questions/21157739/iterating-through-queue-with-for-loop-instead-of-while-loop을 참조하십시오. –

답변

4

PriorityQueue은 데이터 구조에 대해 for 루프 구문 작업을 수행하는 내부 함수를 지원하지 않습니다 (예 : __iter__next).

대신 큐가 empty 기능 비어있는 경우 확인하는 while 루프를 사용할 수 있으며, 비어 있지 않은 경우, get 또는 필요에 따라 get_nowait 제거하고 준비로 대기열에서 항목을 반환하기 위해 호출합니다.

큐에서 다음 항목을 사용한다는 의미를 알기 위해 호출자 측에서 특별한 지식이 필요하기 때문에 for-loop 반복을 지원하는 것이 불편할 수 있습니다. for-loop는 큐에 대해 무엇을할까요? 현재 항목을 성공적으로 소비 한 직후 항상 get_nowait으로 소비한다고 가정하십니까? 그런 다음 대기열에 즉시 반환 할 항목이없는 경우 예외가 발생할 수 있습니다. 항상 get을 사용해야하며 각 항목을 영원히 기다리지 않아야합니까? 그렇다면 for-loop 구문은 가능한 합병증을 위장하여 영원히 기다릴 것입니다.

이러한 옵션 중 하나를 기본 반복 동작으로 선택하는 대신 많은 대기열 사용 사례에서 예상치 못한 동작이 발생할 수 있으므로 표준 라이브러리 구현은 호출자에게 while 루프 I 큐의 각 항목을 "가져 오는"방법을 명시 적으로 설명합니다.

(참고 :이 PriorityQueue 라이브러리/구현은 same as from the standard library queue module입니다.)

+0

설명과 문제에 대한 해결책을 주셔서 대단히 감사합니다! :) –

0

는이 정보 숨기기 나누기 물론

for elem in frontier.queue: 
     print(elem) 

, 그보고 구현 코드를 확인할 수 있지만, 어쩌면 atribute 이런 이유로 self.queue하지 self._queue 지정됩니다.