Python 如何创建一个包含迭代的10个最新值的列表?
我想要一个列表,其中包含在Python 如何创建一个包含迭代的10个最新值的列表?,python,python-3.x,Python,Python 3.x,我想要一个列表,其中包含在for循环中计算的十个最新值。 我试图删除列表中的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 *
for
循环中计算的十个最新值。
我试图删除列表中的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
回溯(最近一次呼叫最后一次):
文件“******.py”,第9行,在
del points[i-10]
索引器:列表分配索引超出范围
我不确定这是为什么,因为名单已经足够长了,有条件保证。
谢谢您的建议。您的列表的长度永远不会超过10个元素,因为一旦长度达到10,您就开始删除第一个元素,然后再添加一个元素。因此,当
i
大于19时,索引i-10
超出列表的范围
您总是添加到列表的末尾,并且逻辑上只希望删除第一个元素。因此,将del点[i-10]
替换为del点[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))
将
del points[i-10]
更改为del points[0]
,因为当我达到20时,它会尝试删除不存在的索引10。所以只需将其更改为0。当然,您的索引超出了范围!您在列表中只保留了10个项目,但i
的范围最多可达999个!如果列表中只有10个项目,您如何想象您可以为项目998-10
编制索引
您需要将其想象为一个队列:一个数据结构,在该结构中,您将项目从前端移除并添加到末尾。事实上,Collections
包有这样的数据结构。然而,出于你自己的目的,简单地做你说过要做的事情:扔掉最旧的物品:
if i > 9: # to check when to start removing the first element
points.pop(0)
points.append(i * x * (1 - x))
请注意,我已经重构了新元素:在if
的每个分支中都执行相同的操作,因此复制代码是没有意义的
您的最后分数是
[-971279100, -974224352, -977175552, -980132706, -983095820,
-986064900, -989039952, -992020982, -995007996, -998001000]
这就是你想要的:
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))
这是因为一旦列表中有10个元素,您一次只添加一个元素,并且您将始终删除列表中的第一个元素,即点[0],您可以从创建长度为10的列表开始,然后循环索引。要提取值,您必须从index+1
到末尾提取切片,然后从开始提取到index
(其中index
是点列表的当前索引,即i%10
)
这将比修改列表更有效,因为删除列表的第一个元素具有时间复杂性O(n)
如果您希望在没有None
的情况下打开输出,并将元素从最新到最旧排序,则可以按如下方式打印:
ordered_filtered_list = [x for x in (points[index:] + points[:index]) if x is not None]
print('Recent values:', ordered_filtered_list)
想想当i
为100时会发生什么:您试图删除点[90]
中的元素,但列表的长度只有10,因此出现了超出范围的错误。确实,您希望每次都删除列表的第一个元素。因此该行应为del points[0]
但是,更有效的方法是始终确保列表长度不超过10:
points=[]
对于范围(1000)内的i:
x=i+1
点。附加(i*x*(1-x))
点数=点数[-10:]
点[-10:][/code>选择列表中最后10个元素中的所有元素。如果将print(i)
放在循环中,您会清楚地看到当i
=20时,它失败了,并且可能已经能够找出哪里出了问题。@alaniwi您是对的,感谢您内置的集合模块包括可用于points=deque(maxlen=10)
和后续附加的内容。这会给以前的答案增加什么?@Prune,无论它是否添加了内容,它都可以帮助我从不同的角度理解解决方案,作为提问者,“这对我很有帮助。”普伦姆,对不起,我的回答与另一个答案不符。
ordered_filtered_list = [x for x in (points[index:] + points[:index]) if x is not None]
print('Recent values:', ordered_filtered_list)