2011-04-20 111 views
1

以下代码片段尝试创建一个地图,该地图显示从该地图上的每个方形到指定位置所需的最小移动次数。作为一个整体的功能在很大程度上与问题无关,但我认为我应该在上下文中提供我的问题。我也从集合中导入了deque。奇怪的部分来自第7行。我得到TypeError:'int'对象不可迭代。但是,“distance_from_loc,f_loc = squares_to_check.popleft()”这个语句不应该试图对任何事物进行迭代以达到最好的知识。任何帮助将不胜感激。当我不尝试迭代时,'int'对象不可迭代

def complex_distance(self, loc): 
     row, col = loc 
     squares_to_check = deque((0, loc)) 
     self.complex_distance_map = zeros((self.height, self.width), int) + 999 
     self.complex_distance_map[row][col] = 0 
     while squares_to_check: 
      distance_from_loc, f_loc = squares_to_check.popleft() 
      distance_from_loc += 1 
      for d in AIM: 
       n_loc = self.destination(f_loc, d) 
       n_row, n_col = n_loc 
       if distance_from_loc < self.complex_distance_map[n_row][n_col] and not self.map[n_row][n_col] == -4: 
        squares_to_check.append((distance_from_loc, n_loc)) 
        self.complex_distance_map[n_row][n_col] = distance_from_loc 

回答

6

线确实尝试进行迭代:

>>> a, b = 0 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'int' object is not iterable 

线

squares_to_check = deque((0, loc)) 

初始化与所述两个元件0loc,不与单个元件(0, loc)双端队列。使用

squares_to_check = deque([(0, loc)]) 

以获得期望的结果。

+0

我的意图是追加一个元组作为deque中的第一个元素,就像我之后弹出这些值并分别将它们分配给distance_from_loc和f_loc。我所做的不应该等于a,b = 0,而应该是a,b =(0,0),这确实有效。 – 2011-04-20 13:17:12

+0

@user:我想我明白了你的意图。这就是为什么我指出如何正确初始化包含单个元组的deque。第一部分只是为了说明你的错误信息是如何产生的。 – 2011-04-20 13:30:35

+0

举起!你其实是正确的。在我的测试中,我改变了原来的赋值和调用,因为我不知道deque((a,b))不等于some_deque.append((a,b)) – 2011-04-20 13:33:35