IndexError:列表索引超出范围但我知道"它是

时间:2015-01-14 10:25:04

标签: python

我想知道为什么可能会出现以下情况:

我有一个清单:

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

到目前为止:

  1. 如果我将每个all_hits[i][1]的长度大于3个字符的文件写入文件,则会达到约18,000个条目,但如果我打印len(all_hits)则答案为39,000个元素。
  2. 我可以打印all_hits[-1]条目,但它与书面列表中的最终条目不符。
  3. 据我所知,我并没有改变原来的名单。

    为什么?我在这个问题上已经有2天了,这让我发疯了。

    编辑: 3.我打印了最后一个条目和一些之后/之前的条目,以确保它们具有正确数量的元素,并且一切看起来都很好。

    编辑并谢谢你:

    谢谢大家。当然,你是对的。我的一个条目无处不在,只有一个列表对象。我不知道如何或为什么,但这完全是一条不同的鱼!

    感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

在这一行if len((all_hits[i])[1]) >= 3:中,您应该通过双重引用[i][1]了解您的假设:

  • all_hits是一个列表清单。例如[[1,2],[4,5],[7,8],[9]]
  • 并且all_hits中的每个列表至少有2个条目。

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:
  • function len始终只返回整数,因此显式强制转换
  • 表达式int(length_hits) - 1可以是负数(如果list是emty),那么理论上你可以陷入无限循环(i = -2会导致无限循环)。

IMO应该是:

while len(all_hits):
    do_staff()

修改

我对 Burhan Khalid 响应添加评论没有声誉,但我不建议在执行期间更改的序列上使用for。这是一种不好的做法。