Как сделать генератор в словаре для вывода N записей за раз?
Есть класс AddressBook который наследуется от UserDict. Как мне в методе Iterator сделать генератор по записям словаря и за одну итерацию возвращать по n записей? Сначала я пытался написать iter и next, но потом понял что он наследуется и у него уже есть эти методы. Поэтому нужно написать это в методе Iterator, но пока что не понимаю как это сделать потому что генераторы и итераторы сложно даются мне. Также я пытался брать срезы до n, но это не список. В закомментированом коде я сделал ключи и значения в виде списков, в которых можно брать срезы, но это тоже не то - мне же нужен вывод в виде словаря. В общем объясните как это можно сделать пожалуйста.
class AddressBook(UserDict):
address_book = {}
def iterator(self, n):
if not self.data:
raise StopIteration
records_to_return = self.data[:n]
self.data = self.data[n:]
#a = list(self.data.keys())
#b = list(self.data.values())
#print(a[:n])
#print(b[:n])
for record in self.data:
print(record, '???')
Ответы (1 шт):
chunks принимает на вход любую последовательность, которую можно итерировать (например, address_book.items()), и разбивает её на фрагменты не более n штук в каждом. Метод iterator использует её чтобы выдать self.data кусочками по n штук.
Документация по itertools.islice.
import itertools
def chunks(seq, n):
it = iter(seq)
while True:
t = tuple(itertools.islice(it, n))
if len(t) == 0:
break
yield t
class AddressBook(UserDict):
address_book = {}
def iterator(self, n):
for c in chunks(self.data, n):
yield c
iterator можно записать по-другому:
def iterator(self, n):
return chunks(self.data, n):