为什么会出现IndexError:列表索引超出范围

时间:2020-06-26 11:06:46

标签: python list arraylist error-handling index-error

在我的代码中,我遇到了索引错误-IndexError:列表索引超出范围。您能否1)解释为什么会这样,然后2)对我的代码进行一些更正?谢谢您的提前答复

x = [1, 2, 3, 4, 5]

for i in range(len(x)):
    if x[i] % 2 == 0:
        del x[i]

6 个答案:

答案 0 :(得分:2)

改为使用新列表(理解):

x = [1, 2, 3, 4, 5]

y = [item for item in x if not item % 2 == 0]
print(y)
# [1, 3, 5]

或者-被认为是“更多pythonic”:

y = [item for item in x if item % 2]

答案 1 :(得分:2)

使用del时,您可以减小数组的大小,但是初始循环会遍历数组的初始大小,因此会出现IndexError。

如果要删除项目,我建议使用列表理解:

x = [1, 2, 3, 4, 5]

x_filtered = [i for i in x if i%2]

答案 2 :(得分:1)

这是因为要删除循环中的对象,换句话说,就是使列表更短。

代替使用此:

x = x[0::2]

选择列表的第二个值

如果您想要所有偶数值,请使用列表生成器:

x = [value for value in x in value%2 == 0]

答案 3 :(得分:0)

您要从要迭代的列表中删除项目。一种替代方法是:

private void btnCopy_Click(object sender, EventArgs e)
    {
        Copy(sourceDirectory, targetDirectory);
    }

public static void Copy(string sourceDirectory, string targetDirectory)
    {
        DirectoryInfo diSource = new DirectoryInfo(sourceDirectory);
        DirectoryInfo diTarget = new DirectoryInfo(targetDirectory);

        CopyAll(diSource, diTarget);
    }
public static void CopyAll(DirectoryInfo source, DirectoryInfo target)
    {
        // Copy each file into the new directory.
        foreach (FileInfo fi in source.GetFiles())
        {
            fi.CopyTo(Path.Combine(target.FullName, fi.Name), true);
        }

        // Copy each subdirectory using recursion.
        foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
        {
            DirectoryInfo nextTargetSubDir =
                target.CreateSubdirectory(diSourceSubDir.Name);
            CopyAll(diSourceSubDir, nextTargetSubDir);
        }
    }
private void btnStop_Click(object sender, EventArgs e)
   {
            //A way to stop CopyAll(DirectoryInfo source, DirectoryInfo target) execution
   }

输出:

x = [1, 2, 3, 4, 5]
answer = [i for i in x if i % 2 != 0]

print(answer)

答案 4 :(得分:0)

x = [1, 2, 3, 4, 5]

for i in range(len(x) -1, -1, -1):
    if x[i] % 2 == 0:
        x.pop(i)

“范围函数带有三个参数。

第一个是起始索引,即[列表长度– 1],即最后一个列表元素的索引(因为列表元素的索引从0到长度– 1)。

第二个参数是停止迭代的索引。

第三个参数是步长。 由于我们需要在每次迭代中将索引减少1,因此应该为-1。“-Source

我强烈建议您理解列表,但是在某些情况下没有意义,可以通过迭代删除列表。由你决定〜

答案 5 :(得分:0)

如果要删除某些项目,请使用while循环而不是for循环。

    x = [1, 2, 3, 4, 5]
    i = 0
    while i<len(x):
        if x[i]%2==0:
            del x[i]
        i+=1
    print(x)