Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何创建一个包含迭代的10个最新值的列表?_Python_Python 3.x - Fatal编程技术网

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)