Python:列表索引超出范围,但列表中有项目?

时间:2016-04-17 13:07:55

标签: python list

我正在尝试将18个列表项添加到3个文本文件中,每个文件6个项目。 paths[0]paths[1]文本文件正确,但第三个paths[2]只能获得3个项目。

mainStudents = ["1 Name Surname D1", "2 Name Surname D2" ...16x]
def randomize(path):
    count = 0
    currentpathIs = getprojdir + "\\" + "\shuffled" + path
    print(currentpathIs)
    with open(currentpathIs, "a+") as file:
        while True:
            try:
                file.write(mainStudents[count] + "\n")
                del(mainStudents[count])
                print(count)
                count += 1
            except Exception as e:

                print(mainStudents)
                break
            if count == 6:
                break

randomize(paths[0])  
randomize(paths[1])
randomize(paths[2])

我收到了这个错误:

  

追踪(最近一次呼叫最后一次):

     

文件“C:\ Users \ user \ Desktop \ New folder \ python.py”,第53行,随机化(路径[2])

     

文件“C:\ Users \ user \ Desktop \ New folder \ python.py”,第43行,随机化       file.write(mainStudents [count] +“\ n”)

     

IndexError:列表索引超出范围

但是mainStudents列表中还有3个项目?

1 个答案:

答案 0 :(得分:1)

您遇到的问题是,当您从列表中删除该项目时,您将减小其大小。因此,您的计数将增加,然后尝试访问不再存在的索引。举一个非常简单的例子来看一个大小为二的列表:

mainStudents[0]

现在,当您调用方法时,将会发生什么,第一次迭代将起作用,因为您将访问['2 Name Surname D2']

但是,在第二次迭代中,您已从列表中删除该项目,因此现在您的列表如下所示:

0

现在是一个大小为1的列表,其索引访问权限为count

因此,while循环的下一次迭代将在1IndexError。因此,这正是您while的来源。

决定使用列表中的del循环和mainStudents项的组合是导致问题的原因。相反,选择你想要迭代的东西,你的逻辑似乎是def randomize(path): currentpathIs = getprojdir + "\\" + "\shuffled" + path print(currentpathIs) with open(currentpathIs, "a+") as file: for student in mainStudents: file.write(student + "\n") 。那么为什么不这样做呢?

\n

您可以通过使用可用的字符串方法join简单地获取列表并将其转换为由'\n'.join(mainStudents) 分隔的字符串来进一步简化:

os.path.join

此外,还有一些方法可以促进路径创建。看一下os模块。更具体地说是from os.path import join def randomize(path): currentpathIs = join(getprojdir, shuffled, path) with open(currentpathIs, "a+") as file: file.write('\n'.join(mainStudents)) 。因此,您的代码可以进一步简化为:

public class Class2 : IInfoCard
{
     public string Name { get; set;}
}