我希望有一个列表,其中包含在for
循环中计算的10个最近的值。我尝试删除列表中的i - 10
元素,然后追加在i'th
迭代中计算出来的值。以下是我尝试过的:
points = []
x = 0
for i in range(1000):
x += 1
if i > 9: # to check when to start removing the first element
del points[i - 10]
points.append(i * x * (1 - x)) # appending the value calculating
else:
points.append(i * x * (1 - x))
但是,我得到了以下错误:
Traceback (most recent call last):
File "*******.py", line 9, in <module>
del points[i - 10]
IndexError: list assignment index out of range
我不知道这是为什么,因为列表足够长,条件的保证。谢谢你的建议。
发布于 2020-08-12 20:45:22
列表的长度永远不会超过10个元素,因为一旦到了10长度,就会在添加第一个元素之前开始删除第一个元素。因此,当i
大于19时,索引i - 10
超出了列表的范围。
您总是将其添加到列表的末尾,并且逻辑上只希望删除第一个元素。因此,将del points[i - 10]
替换为del points[0]
points = []
x = 0
for i in range(1000):
x += 1
if i > 9: # to check when to start removing the first element
del points[0]
points.append(i * x * (1 - x)) # appending the value calculating
else:
points.append(i * x * (1 - x))
发布于 2020-08-12 20:49:17
您可以从创建长度为10的列表开始,然后循环遍历索引。要提取值,您必须从index + 1
提取到末尾的切片,然后从开始提取到index
(其中index
是点列表的当前索引,即i % 10
)。
这将比修改列表更有效,因为删除列表的第一个元素具有时间复杂度O(n)。
points = [None] * 10
for i in range(1000):
x = i + 1 # This seems to be the same as your x.
value = i * x * (1 - x)
index = i % 10
points[index] = value
# Do this whenever you want to print
index = (index + 1) % 10
print('Recent values:', points[index:] + points[:index])
如果您希望在不使用None
的情况下打开输出,并将元素从最新的排序到最旧的,您可以这样打印它们:
ordered_filtered_list = [x for x in (points[index:] + points[:index]) if x is not None]
print('Recent values:', ordered_filtered_list)
发布于 2020-08-12 20:52:54
想想当i
为100时会发生什么:您试图删除points[90]
中的元素,但是列表的长度只有10,因此出现了超出范围的错误。实际上,每次都要删除列表中的第一个元素。所以这一行应该是del points[0]
。
但是,一个更有效的方法是使用切片来确保列表不超过10长:
points = []
for i in range(1000):
x = i+1
points.append(i * x * (1 - x))
points = points[-10:]
points[-10:]
从列表中的第10个元素中选择所有元素。
https://stackoverflow.com/questions/63384412
复制相似问题