通过生成器向deque()添加项目

问题描述 投票:0回答:1

我有素数生成器。产生的项目将强制转换为列表。我可以引用列表中的任何项目。

def primes(limit):
    yield 2
    if limit < 3:
        return
    lmtbf = (limit - 3) // 2
    buf = [True] * (lmtbf + 1)
    for i in range((int(limit ** 0.5) - 3) // 2 + 1):
        if buf[i]:
            p = i + i + 3
            s = p * (i + 1) + i
            buf[s::p] = [False] * ((lmtbf - s) // p + 1)
    for i in range(lmtbf + 1):
        if buf[i]:
            yield i + i + 3


x = list(primes(100))
print(x)
print(len(x), '\n')

输出:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
25

问题是,如果我使用x = list(primes(num))并使用非常大的数字,则结果列表将变为很大。

我想要的是列表中的最后n个(最大)项目,但我可以更改n个。

我以为deque()会是完美的选择。我查看了文档,发现:附加到已满的双端队列(len(d)== d.maxlen)会从另一端丢弃项目。

这加上我在队列创建时指定maxlen = n的功能,正是我想要的。

考虑到这一点,我尝试了这个:

from collections import deque


def primes(limit):
    yield 2
    if limit < 3:
        return
    lmtbf = (limit - 3) // 2
    buf = [True] * (lmtbf + 1)
    for i in range((int(limit ** 0.5) - 3) // 2 + 1):
        if buf[i]:
            p = i + i + 3
            s = p * (i + 1) + i
            buf[s::p] = [False] * ((lmtbf - s) // p + 1)
    for i in range(lmtbf + 1):
        if buf[i]:
            yield i + i + 3


x = deque([primes(100)], maxlen=10)
# x = list(primes(100))
print(x)
print(len(x), '\n')

但是我得到的是:

deque([<generator object primes at 0x0000025ED8449C80>], maxlen=10)
1 

我也尝试过:

for i in x:
    print(x)

但是那也不起作用。

我如何如上所述使用deque()获得所需的结果?

我需要能够打印出双端队列的内容,它应该是生成器中的最后n个项目。

python-3.x deque
1个回答
0
投票

计算出来:x = deque([x表示x以质数(100)表示,maxlen = 10)

deque([53,59,61,67,71,73,79,83,89,97],maxlen = 10)10

x = deque([x表示素数(1000)中的x,maxlen = 10)

deque([937,941,947,953,967,971,977,983,991,997],maxlen = 10)10

© www.soinside.com 2019 - 2024. All rights reserved.