首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得包含迭代的10个最近值的列表?

如何获得包含迭代的10个最近值的列表?
EN

Stack Overflow用户
提问于 2020-08-12 20:38:39
回答 6查看 688关注 0票数 1

我希望有一个列表,其中包含在for循环中计算的10个最近的值。我尝试删除列表中的i - 10元素,然后追加在i'th迭代中计算出来的值。以下是我尝试过的:

代码语言:javascript
运行
复制
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)) 

但是,我得到了以下错误:

代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "*******.py", line 9, in <module>
    del points[i - 10]
IndexError: list assignment index out of range

我不知道这是为什么,因为列表足够长,条件的保证。谢谢你的建议。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2020-08-12 20:45:22

列表的长度永远不会超过10个元素,因为一旦到了10长度,就会在添加第一个元素之前开始删除第一个元素。因此,当i大于19时,索引i - 10超出了列表的范围。

您总是将其添加到列表的末尾,并且逻辑上只希望删除第一个元素。因此,将del points[i - 10]替换为del points[0]

代码语言:javascript
运行
复制
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))
票数 5
EN

Stack Overflow用户

发布于 2020-08-12 20:49:17

您可以从创建长度为10的列表开始,然后循环遍历索引。要提取值,您必须从index + 1提取到末尾的切片,然后从开始提取到index (其中index是点列表的当前索引,即i % 10)。

这将比修改列表更有效,因为删除列表的第一个元素具有时间复杂度O(n)。

代码语言:javascript
运行
复制
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的情况下打开输出,并将元素从最新的排序到最旧的,您可以这样打印它们:

代码语言:javascript
运行
复制
ordered_filtered_list = [x for x in (points[index:] + points[:index]) if x is not None]
print('Recent values:', ordered_filtered_list)
票数 2
EN

Stack Overflow用户

发布于 2020-08-12 20:52:54

想想当i为100时会发生什么:您试图删除points[90]中的元素,但是列表的长度只有10,因此出现了超出范围的错误。实际上,每次都要删除列表中的第一个元素。所以这一行应该是del points[0]

但是,一个更有效的方法是使用切片来确保列表不超过10长:

代码语言:javascript
运行
复制
points = []

for i in range(1000):
    x = i+1
    points.append(i * x * (1 - x))
    points = points[-10:]

points[-10:]从列表中的第10个元素中选择所有元素。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63384412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档