Python列表帮助

时间:2010-08-16 15:26:15

标签: python list

我有一个列表如下:

floodfillque = [[1,1,e],[1,2,w], [1,3,e], [2,1,e], [2,2,e], [2,3,w]]

for each in floodfillque:
    if each[2] == 'w':
        floodfillque.remove(each)
    else:
        tempfloodfill.append(floodfillque[each[0+1][1]])

这是一个简化的,但我认为代码的相关部分。

floodfillque[each[0+1]]部分是否按照我的想法行事,并在该位置获取值并添加一个或不添加?我问的原因是我收到了这个错误:

  

TypeError:'int'对象是unsubscriptable

我认为我误解了代码实际上在做什么或做错了什么。

5 个答案:

答案 0 :(得分:5)

除了您的代码中已经发现其他答案的错误之外,您还至少还有一个:

for each in floodfillque:
    if each[2] == 'w':
        floodfillque.remove(each)

不要在您正在循环播放的容器中添加或删除项目。虽然这种错误通常仅针对某些类型的容器(不包括列表)进行诊断,但对于列表来说同样糟糕 - 它最终会通过跳过某些项目或查看某些项目两次来改变您的预期语义。

如果你不能大幅改变和增强你的逻辑(通常是通过建立一个新的,单独的容器而不是与你正在循环的容器混淆),最简单的解决方法通常是循环副本< / strong>你必须改变的容器:

for each in list(floodfillque):

现在,你的添加和删除不会改变你实际循环的内容(因为你正在循环的是一个副本,一个“快照”,在循环开始时一劳永逸)所以你的语义将会按计划工作。

您更改floodfillque的具体方法也有性能错误 - 它的行为是二次方的,而声音逻辑(构建新容器而不是更改原始容器)会呈线性行为。但是,如果不将您的代码从当前不那么好的逻辑重构为新的,有充分根据的逻辑,那么该错误就很难修复。

答案 1 :(得分:4)

以下是发生的事情:

在循环的第一次迭代中,each[1, 1, 'e']。自each[2] != 'w'起,else即被执行。

else中,您需要each[0+1][1],这与(each[0+1])[1]相同。 each[0+1]1,因此您正在(1)[1]。无法对int个对象编制索引,这就是引发错误的原因。

答案 2 :(得分:3)

  

floodfillque [每个[0 + 1]部分   做我认为它正在做和采取的   该位置的值并添加   一个或不一个?

不,这听起来像你想要each[0] + 1

无论哪种方式,您获得的错误都是因为您尝试将整数的第二项... each[0+1][1]解析为each[1][1],这可能类似于{{1} },这没有任何意义。

答案 3 :(得分:3)

其他海报是正确的。但是,此代码中还有另一个错误,即您在迭代它时正在修改floodfillque。这将导致问题,因为Python内部维护一个计数器来处理循环,删除元素不会修改计数器。

执行此操作的安全方法是迭代循环的副本:

for each in floodfillque[ : ]:

[ : ]是Python的副本表示法。)

答案 4 :(得分:1)

以下是我对诺亚克拉克的意图的理解:

  1. 删除第三个元素为'w'
  2. 的子列表
  3. 对于剩余的子列表,将1添加到第二个项目
  4. 如果是这种情况,将执行以下操作:

    # Here is the original list
    floodfillque = [[1,1,'e'], [1,2,'w'], [1,3,'e'], [2,1,'e'], [2,2,'e'], [2,3,'w']]
    
    # Remove those sublists which have 'w' as the third element
    # For the rest, add one to the second element
    floodfillque = [[a,b+1,c] for a,b,c in floodfillque if c != 'w']
    

    此解决方案工作正常,但效率不高:它会创建一个新列表,而不是修补原始列表。