【问题标题】:pop index out of range -homework (Lists, for loop, while loop) [duplicate]弹出索引超出范围-作业(列表,for循环,while循环)[重复]
【发布时间】:2015-03-12 16:45:34
【问题描述】:

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

编写并测试一个函数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 平均值 = sum(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 主(左)

12 打印(L)

【问题讨论】:

  • 您在迭代列表时更改了列表的长度 - 这是一个非常糟糕的主意。参见例如stackoverflow.com/q/1798796/3001761
  • @but 我现在得到:TypeError: 'list' object is not callable because L(i), insead use this, L[i]

标签: python


【解决方案1】:

除了 jonrsharpe 的评论,问题在于您使用 pop() 就好像它删除了项目 J,但该方法实际上旨在删除该索引处的项目。

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

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

【讨论】:

  • 如何解决在迭代列表时修改列表的问题?
  • 没有,但在这种情况下,这不是他的问题。一旦他解决了他的主要问题,他就可以查看 jon 的链接,以更详细地说明为什么这是一个坏主意。
【解决方案2】:

除了@johnsharpe 的好点,pop 获取您要删除的元素的 index,同时将 value 传递给它。

如果您对列表的索引 进行迭代,则可以同时使用pop 并避免在迭代时进行修改。但请注意:当您从列表中删除某些内容时,它会变小,并且一些索引现在包含新值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2023-02-08
    相关资源
    最近更新 更多