Как сделать генератор в словаре для вывода N записей за раз?

Рейтинг: 0Ответов: 1Опубликовано: 27.02.2023

Есть класс 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):