pop index超出范围-homework(列表,for循环,while循环)

时间:2015-03-12 16:45:35

标签: python

我目前正在做一个家庭作业问题:

  

编写并测试一个函数modify_list,给出一个浮动列表   将数字作为参数,计算其中的平均值   列表并删除大于给定值的平均值   列表。

到目前为止,我的代码看起来像这样:

def modify_list(L):

    average = sum(L) / (len(L))
    j=0
    for J in L:
        if J>average:
            L.pop(J)
        else:
            j=j+1

L=[3,12,2,21,2,1,2]

modify_list(L)

print(L)

到目前为止,我的列表已传递给我的函数modify_list,然后计算列表的平均值。然后我有一个for循环,它接受列表中的每个值并将其与平均值进行比较。如果列表中的值大于平均值,则会通过L.pop(J)删除它。唯一的问题是我的错误,即:

Traceback (most recent call last):
  File "/Users/nathan/CP/test/src/test.py", line 22, in <module>
    modify_list(L)
  File "/Users/nathan/CP/test/src/test.py", line 17, in modify_list
    L.pop(J)
IndexError: pop index out of range

我应该尝试while循环而不是for循环吗?

我创建了一个while循环,它完美地工作......尽管L.remove(i)也完美地工作。我仍然不明白为什么L.remove(i)是一个坏主意。 这是我的新代码:

1 def main(L):

2平均值=总和(L)/(len(L))

3 i = 0

我是4岁

5如果L [i]>平均值:

6 L.pop(i)

7其他:

8 i = i + 1

9

10 L = [3,12,2,21,2,1,2]

11 main(L)

12 print(L)

2 个答案:

答案 0 :(得分:-1)

除了@ johnsharpe非常好,pop获取要删除的元素的 index ,同时传递。< / p>

如果您反复遍历列表的 indices ,则可以使用pop并避免在迭代时进行修改。但要小心:当你从列表中删除某些内容时,它会变小,而某些索引现在会有新值。

答案 1 :(得分:-1)

除了jonrsharpe的评论之外,问题在于您使用pop()就像删除了项目J一样,但该方法实际上是为了删除该索引处的项目。

例如,当您发现21高于平均值并尝试使用L.pop(21)将其删除时,它会在列表中查找第21项。由于没有那么多项,因此会出现IndexError。

使用L.remove(21)而不是pop()来解决此问题。删除类似于pop(),但它会删除列表中第一个具有给定值的项目,正如您尝试的那样。