在last code中,我尝试使用一个数组来删除信息。
在这篇文章中,我使用了三个数组来删除以下信息:
class student(object):
def __init__(self):
self.c=0
self.x=[]
self.y=[]
self.z=[]
def vrod(self):
self.x.append(input("enter name:"))
self.z.append(int(input("enter #:")))
self.y.append(int(input("enter score:")))
self.c+=1
def remove(self):
self.p=int(input("enter student number:"))
for self.i in range(len(self.x)):
if self.p==self.z[self.i]:
del(self.x[self.i])
del(self.y[self.i])
del(self.z[self.i])
def report(self):
for self.i in range(len(self.x)):
print("name:",self.x[self.i],"st number:",self.z[self.i],"score:",self.y[self.i])
a=student()
while True:
print("o=1:::add ","o=2:::remove ","o=3:::report ","o=4:::exit")
o=int(input("enter menu:"))
if o==1:
a.vrod()
elif o==2:
a.remove()
elif o==3:
a.report()
elif o==4:
break
同样,我有删除的问题。当我输入数字进行删除时,我会收到错误,因为它是
“if self.p == self.z [self.i]:IndexError:list index out of range”。
你知道这是什么问题吗?
哪一个比较常见?用一个数组或三个数组编写代码。
答案 0 :(得分:0)
您的问题是,您正在迭代循环并对您在执行此操作时循环的列表进行更改。这样做的冲动是可以理解的,但除非你知道自己在做什么,否则你应该避免这样做。无论如何,让我们来看看你正在做什么以及它如何影响循环和列表。删除多余的东西,它的基础是:
def remove(x):
for i in range(len(x)):
del(x[i])
#Do other stuff
现在,让我们给x一些虚拟值:
values = [4, 10, 23]
remove(values)
在我们运行代码之前,确切了解range(len(x))
做了什么很有用,也就是说它创建了一个新的列表,从0
开始以{{1}为增量进行计数(只要没有指定其他内容),并且其中的元素数量等于输入列表的长度。
因此,请将1
我们的虚拟值range(len(x))
提供给我们。输出为[4, 10, 23]
因此,如果我们回到for循环,这意味着在for循环初始化之后几乎无论我们做什么,for循环将计算这个新生成的列表{{1 }}。所以尽管如此,让我们实际上逐行运行代码。
[0, 1, 2]
这会删除列表中的元素0,这会给我们留下[0, 1, 2]
。请注意,自删除此元素后,#first loop
#i = 0
del(x[0])
#x=[10, 23]
和x=[10, 23]
切换位置,列表变为1个元素更短。我们循环的列表仍然是相同的,10
所以让我们看看下一个循环会发生什么:
23
这会删除列表中的元素[0, 1, 2]
,现在为#second loop
#i = 1
del(x[1])
x = [10]
,只留下1
。注意我们是如何跳过我们想要删除的元素的。不是一个好兆头。任何谁,进入最后的循环:
23
这是Python看到明显错误并被迫停止程序的地方。此时,如果您执行x=[10]
,它将返回#third loop
#i = 2
del(x[2])
#IndexError
,这意味着列表中的最后一个元素将具有引用len(x)
。因此,当您再调用1
时,您实际上是在告诉Python删除不存在的内容。
所以,现在我们对出了什么问题有一个很好的概述,那么我们如何才能做到这一点呢?一种方法是将解决方案放在首位。我们创建一个新列表并将元素添加到我们想要保留的列表中,而不是删除我们想要在for循环中删除的元素。为简单起见,我在上面的示例中删除了0
语句,但我在解决方案中将其添加回去,以演示当您不想删除所有元素时如何执行此操作名单。我不会像上一个例子那样走过它,所以看看它并分析它并试着理解它为什么会以它的工作方式工作(" #condition你要删除的地方:"是伪代码,所以不要直接解释它:
del(x[2])
我希望这很有用