У меня есть генератор простых чисел. Полученные предметы брошены в список. Я могу сослаться на любой элемент в списке.
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 элементов из генератора.