我目前正在做一个家庭作业问题:
编写和测试一个函数
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(我)也工作得很好。我仍然不明白为什么L.remove(我)是个坏主意。这是我的新代码:
1 def main(L):
2平均值=和(L)/ (len(L))
3个i=0
4.趁我
5如果Li>average:
6 L.pop(i)
7其他:
8个i=i+1
9
10 L=3,12,2,21,2,1,2
11 main(L)
12打印(L)
发布于 2015-03-12 16:51:30
除了@johnsharpe的优点外,pop还接受要删除的元素的索引,同时传递它的值。
如果您迭代列表的索引,则可以使用pop,并且在迭代时避免修改。但是要小心:当您从列表中删除某个内容时,它会变得更小,并且一些索引中现在有了新的值。
发布于 2015-03-12 16:54:07
除了jonrsharpe的评论之外,问题是您使用pop()就好像它删除了项目J一样,但是这个方法实际上是为了删除索引中的条目。
例如,当您发现21高于平均值并试图用L.pop(21)删除它时,它会在列表中查找第21项。由于没有那么多的项目,您将得到一个IndexError。
使用L.remove(21)而不是pop()来修复这个问题。Remove类似于pop(),但是它用给定的值删除列表中的第一项,就像您试图做的那样。
https://stackoverflow.com/questions/29015576
复制相似问题