我如何使用删除此代码(2)?

时间:2016-07-14 07:48:55

标签: python

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”。

你知道这是什么问题吗?

哪一个比较常见?用一个数组或三个数组编写代码。

1 个答案:

答案 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])

我希望这很有用