Python列表帮助

Python列表帮助,python,list,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 = [[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”对象不可订阅

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

洪水是否会填充[每个[0+1]部分 做我认为它正在做和采取的事情 该位置的值并添加 一个还是没有

不,听起来好像您想要
每个[0]+1


无论哪种方式,您都会遇到错误,因为您试图获取整数的第二项…
每个[0+1][1]
都解析为
每个[1][1]
,这可能类似于
3[1]
,这没有任何意义。

发生的情况如下:

在循环的第一次迭代中,
每个
都是
[1,1,'e']
。因为
每个[2]!=“w”
,所以执行
其他


的else
中,您使用
每个[0+1][1]
,它与
(每个[0+1])[1]
相同
每个[0+1]
都是
1
,因此您正在执行
(1)[1]
int
对象无法被索引,这是导致错误的原因。

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

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

for each in floodfillque[ : ]:

[:]
是Python的复制符号。)

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

for each in floodfillque:
    if each[2] == 'w':
        floodfillque.remove(each)
不要在正在循环的容器中添加或删除项目。虽然这种错误通常只会在特定类型的容器(不包括列表)中诊断出来,但对于列表来说同样可怕——它最终会通过跳过某些项目或两次看到某些项目来改变您的预期语义

如果您不能实质性地改变和增强您的逻辑(通常通过构建一个新的、单独的容器而不是破坏您正在循环的容器),最简单的解决方法通常是循环您必须改变的容器的副本:

for each in list(floodfillque):
现在,您的添加和删除不会改变您实际循环的内容(因为您循环的是一个副本,一个“快照”,在循环开始时一次性创建),所以您的语义将按预期工作


您改变
floodfillque
的特定方法也有一个性能缺陷它的行为是二次的,而逻辑是合理的(构建一个新容器而不是改变原来的容器)但是,如果不将代码从当前不太好的逻辑重构为新的、基础良好的逻辑,那么要修复这个bug就更难了。

以下是我对诺亚方舟意图的理解:

  • 删除第三个元素为“w”的子列表
  • 对于剩余的子列表,在第二项中添加1
  • 如果是这种情况,请执行以下操作:

    # 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']
    

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

    在循环中修改正在迭代的序列是不安全的:我有一个系统要检查以确保不会发生这种情况。但是,可能是因为我正在修改列表,所以我正在循环,这样可以利用这个问题发生?好的,那么解决方案是什么?如果我想要每个[0]+1,我可以这样做吗?什么的解决方案?我只是指出为什么会出现异常。你的问题太不清楚,无法给出任何其他类型的答案。基本上,我如何将1添加到列表索引中。