我想知道为什么可能会出现以下情况:
我有一个清单:
all_hits = list1 + list2
length_hits = len(all_hits)
i = 0
while i < int(length_hits) - 1:
if len((all_hits[i])[1]) >=3:
Do x
else:
Do y
这给了我一个错误:
File "file.py", line z, in Function:
if len((all_hits[i])[1]) >= 3:
IndexError: list index out of range
到目前为止:
all_hits[i][1]
的长度大于3个字符的文件写入文件,则会达到约18,000个条目,但如果我打印len(all_hits)
则答案为39,000个元素。all_hits[-1]
条目,但它与书面列表中的最终条目不符。据我所知,我并没有改变原来的名单。
为什么?我在这个问题上已经有2天了,这让我发疯了。
编辑: 3.我打印了最后一个条目和一些之后/之前的条目,以确保它们具有正确数量的元素,并且一切看起来都很好。
编辑并谢谢你:
谢谢大家。当然,你是对的。我的一个条目无处不在,只有一个列表对象。我不知道如何或为什么,但这完全是一条不同的鱼!
感谢您的帮助!
答案 0 :(得分:1)
在这一行if len((all_hits[i])[1]) >= 3:
中,您应该通过双重引用[i][1]
了解您的假设:
all_hits
是一个列表清单。例如[[1,2],[4,5],[7,8],[9]]
all_hits[0]
是指我的示例中all_hits
- [1,2]
中的第一个列表/条目。
因此all_hits[0][1]
引用[1,2]
示例列表中的第二个元素,即2
。
现在,您可以想象当我到达all_hits
中的第4个条目,即我的示例中的[9]
时。
all_hits[3]
= [9]但是all_hits[3][1]
超出范围,因为您只有一个条目all_hits[3][0]
因此,请确保每个嵌套列表至少有2个条目。 如果你知道他们那么你应该没有问题。而是试试这个:
all_hits = list1 + list2
i = 0
while i <= len(all_hits) - 1:
if len(all_hits[i][1]) >=3:
Do x
else:
Do y
i += 1
答案 1 :(得分:1)
在Python中,您不需要知道要遍历它的列表的长度。其次,不要假设内部项目的长度,尝试看看它是否符合您的期望:
for something in all_hits:
try:
if len(something[1]) >= 3:
do(x)
else:
do(y)
except IndexError:
print('{} does not have two items'.format(something))
答案 2 :(得分:0)
我同意@Loupy关于你的问题,但是如果你确定它存在并且python说它不存在,那么我们如何能帮到你呢?你应该解决你的&#34;怨恨&#34;用python和信任python。
我还在代码中看到另一个问题:
while i < int(length_hits) - 1:
len
始终只返回整数,因此显式强制转换int(length_hits) - 1
可以是负数(如果list
是emty),那么理论上你可以陷入无限循环(i = -2
会导致无限循环)。 IMO应该是:
while len(all_hits):
do_staff()
修改强>
我对 Burhan Khalid 响应添加评论没有声誉,但我不建议在执行期间更改的序列上使用for
。这是一种不好的做法。