首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python列表帮助

Python列表帮助
EN

Stack Overflow用户
提问于 2010-08-16 15:26:15
回答 5查看 293关注 0票数 0

我有一份清单,看上去如下:

代码语言:javascript
复制
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‘对象不可订阅

我想我误解了这段代码到底在做什么或者做错了什么。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-08-16 15:40:16

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

代码语言:javascript
复制
for each in floodfillque:
    if each[2] == 'w':
        floodfillque.remove(each)

不会从您正在上循环的容器中添加或删除项目。虽然这样的错误通常只会被诊断为特定类型的容器(不包括列表),但对于列表来说也同样糟糕--它将通过跳过某些项目或两次看到某些项目来改变您的预期语义。

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

代码语言:javascript
复制
for each in list(floodfillque):

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

更改floodfillque的具体方法还存在一个性能错误--它的行为是二次型的,而声音逻辑(构建新容器而不是修改原始容器)将线性运行。但是,如果不将您的代码从当前不太好的逻辑重构到新的、基础良好的逻辑,这个bug就很难修复。

票数 5
EN

Stack Overflow用户

发布于 2010-08-16 15:31:42

下面是正在发生的事情:

在循环的第一次迭代中,each[1, 1, 'e']。从each[2] != 'w'开始,执行else

else中,使用each[0+1][1],这与(each[0+1])[1]相同。each[0+1]1,所以你在做(1)[1]int对象不能被索引,这就是导致错误的原因。

票数 4
EN

Stack Overflow用户

发布于 2010-08-16 15:31:31

,each0+1部分做了我认为它正在做的事情,在那个位置取值,然后加一个还是不加一个?

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

不管怎么说,你所得到的错误是因为你试图取整数的第二项.each[0+1][1]决定使用each[1][1],它可能类似于3[1],这是没有任何意义的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3494615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档