我目前正在做一个家庭作业问题:
编写并测试一个函数
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)
答案 0 :(得分:-1)
除了@ johnsharpe非常好,pop
获取要删除的元素的 index ,同时传递值。< / p>
如果您反复遍历列表的 indices ,则可以使用pop
并避免在迭代时进行修改。但要小心:当你从列表中删除某些内容时,它会变小,而某些索引现在会有新值。
答案 1 :(得分:-1)
除了jonrsharpe的评论之外,问题在于您使用pop()就像删除了项目J一样,但该方法实际上是为了删除该索引处的项目。
例如,当您发现21高于平均值并尝试使用L.pop(21)将其删除时,它会在列表中查找第21项。由于没有那么多项,因此会出现IndexError。
使用L.remove(21)而不是pop()来解决此问题。删除类似于pop(),但它会删除列表中第一个具有给定值的项目,正如您尝试的那样。