【问题标题】:IndexError: list index out of range for list of lists in for loopIndexError:for循环中列表的列表索引超出范围
【发布时间】:2015-06-05 14:44:05
【问题描述】:

我查看了网站上发布的有关索引错误的其他问题,但我仍然不明白如何修复我自己的代码。我是 Python 的初学者。根据用户输入,我想检查该输入是否位于列表列表中每一行的第四个位置。

代码如下:

#create a list of lists from the missionPlan.txt
from __future__ import with_statement

listoflists = []
with open("missionPlan.txt", "r") as f:
    results = [elem for elem in f.read().split('\n') if elem]
    for result in results:
        listoflists.append(result.split())
#print(listoflists)
#print(listoflists[2][3])

choice = int(input('Which command would you like to alter: '))
i = 0
for rows in listoflists:
    while i < len(listoflists):
        if listoflists[i][3]==choice:
            print (listoflists[i][0])

        i += 1

这是我不断收到的错误:

没有进入 if 语句

【问题讨论】:

  • 首先,choice 已经是一个整数,所以你不再需要int(choice)。另外,你的 for 循环是错误的。每次添加一个之后,您都设置i=0,所以它始终为零。也许修复你的缩进?
  • 我已经做出了建议的更改,但它仍然给我同样的错误@mbomb007
  • 你不需要stackoverflow;你可以自己解决这个问题。 i 太大,或者3 太大。放入一些打印语句,看看数据是什么,然后找出哪个数字太大。不要忘记:计数从零开始,所以如果列表包含三个项目,那么您可以使用的最大索引是 2。
  • 看在 Guido 的份上,请在循环中将 listoflists[i] 替换为 num...(如果它是列表,请不要称其为 num 并删除 num+=1)另外请添加一个空白下面是代码(为了更好的 SO 格式)
  • 但不要使用 list 作为变量名(你不想覆盖它)。请在 while 和 for 循环之间进行选择。

标签: list python-3.x for-loop file-io


【解决方案1】:

所以,我认为这就是您想要做的 - 在“missionPlan.txt”中找到第 4 个单词(在空格上拆分后)与输入的数字匹配的任何行,并打印这些行的第一个单词。

如果这确实是准确的,那么也许沿着这条路线的东西会是更好的方法。

choice = int(input('Which command would you like to alter: '))

allrecords = []

with open("missionPlan.txt", "r") as f:
    for line in f:

        words = line.split()
        allrecords.append(words)

        try:
            if len(words) > 3 and int(words[3]) == choice:
                print words[0]
        except ValueError:
            pass

另外,如果正如您的标签所暗示的那样,您使用的是 Python 3.x,我相当肯定 from __future__ import with_statement 不是特别需要...

编辑:根据下面的 cmets 添加了几行。现在除了检查读取的每一行,并打印每行的第一个字段,其中有第四个字段与输入匹配,它将每一行收集到 allrecords 列表中,拆分为单独的单词作为列表 - 对应于原始问题listoflists。这将允许稍后在代码中对文件进行进一步处理。还修复了一个明显的错误 - 需要将 line 拆分为 words,而不是 f...

另外,回答您的“我似乎无法进入该 if 语句”观察 - 这是因为您将字符串 (listoflists[i][3]) 与整数 (choice) 进行比较。上面的代码既解决了比较不匹配的问题,也解决了检查一行中实际上是否有足够的单词来进行有意义的比较......

【讨论】:

  • 这就是我想要做的,但不完全是。我正在列表列表中每一行的第 4 个元素中搜索一个数字,并将该数字与输入的数字进行比较。文本文件如下所示:
  • 0 1 0 12 0 0 0 0 33.545 45.35 154.000 1 1 0 3 11 1 0 0 0 12.101 222.0 451.222 1 2 4 4 4 0 0 0 0 45.222 457.21 4
  • @Allie 但是,鉴于您发布的代码,您的“列表列表”不只是将原始文件的每一行拆分为字段列表的结果列表吗?上面的代码避免构建“列表列表”,而是依次查看每行的第四个字段......或者您是否需要该“列表列表”以供以后处理?
  • 是的,“列表列表”将用于以后的处理。在第二个 for 循环中,我确实想查看每一行中的第四个字段,但我似乎无法进入该 if 语句。我希望能够将输入的每一行显示为第四个字段,然后最终将这些行也存储在列表中
猜你喜欢
  • 2018-12-14
  • 1970-01-01
  • 2016-10-03
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
相关资源
最近更新 更多