在我的代码中,我遇到了索引错误-IndexError:列表索引超出范围。您能否1)解释为什么会这样,然后2)对我的代码进行一些更正?谢谢您的提前答复
x = [1, 2, 3, 4, 5]
for i in range(len(x)):
if x[i] % 2 == 0:
del x[i]
答案 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)