Добавление предметов в deque () через генератор - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть генератор простых чисел. Полученные предметы брошены в список. Я могу сослаться на любой элемент в списке.

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 (простые числа (num)) с очень большим числом, то результирующий список становится очень большим.

Все, что я хочу, это последние n (самые большие) элементы в списке, но я бы мог иметь возможность варьировать n.

Я думал, что deque ( ) было бы идеально для этого. Я просматривал документацию и обнаружил: при добавлении к полной дамбе (len (d) == d.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 (), как я описал выше, чтобы получить желаемый результат?

Мне нужно иметь возможность распечатать содержимое deque, которое должно быть последним n элементов из генератора.

1 Ответ

0 голосов
/ 16 апреля 2020

Разобрался: x = deque ([x для x в простых числах (100)], maxlen = 10)

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

x = deque ([x для x в простых числах (1000)], maxlen = 10)

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

...