Итератор-класс для вложенных словарей - PullRequest
2 голосов
/ 31 мая 2019

Исходная ситуация

Допустим, у нас есть словарь, хранящий данные временных рядов в виде:

dic = {'M15': 
        { 
            '100001': { 0: [0,1,2,...],
                        1: [0,1,2,...]
                    },
            '100002': { 0: [0,1,2,...],
                        1: [0,1,2,...]
                    },
                    ...
        },
        'H1': {
            '200001': { 0: [0,1,2,...],
                        1: [0,1,2,...]
                    },
            ...
        },
        ...
}

Теперь давайтепредположим, что этот словарь хранится в классе, называемом данными, например:

class data:

    def __init__(self, input: dict):
        self.data = input

newData = data(dic)

Как может быть очевидно, этот класс должен хранить данные временных рядов и возвращать их в течение итерации для дальнейшей обработки в какой-то момент.



Мои вопросы

Я хочу сделать класс итеративным, то есть __next__ будет перебирать все данные в пределахсловарь (следующий вопрос не о том, как перебирать вложенный словарь, поэтому, пожалуйста, не отвечайте на него).Данные означают, что мне нужны массивы только на самом низком уровне в словаре, например, [0,1,2,...].

Предположим, что данные в словаре достаточно велики - они могут уместиться в памяти, но не должны дублироваться.Поэтому, насколько я знаю, понимание списка не является вариантом, поскольку данные также будут храниться в этом новом списке помимо словаря (словарь все еще необходим, а массив в этом примере не является опцией).Для полноты картины это будет выглядеть так:

class data:
    def __init__(self, input: dict):
        self.dictionary = input
        self.data  = [series_array for series_key, series_array in series.items() for ... in self.dictionary.items()]
        self.index = 0
    def __iter__(self):
        return self
    def __next__(self):
        self.index += 1
        return self.data[self.index - 1]

Вопрос 1:

  • Будет ли понимание списка просто указывать на данные в словареили это действительно скопирует данные?

Это означает, что мне придется использовать обычную итерацию по словарю, но я не могу придумать, как реализовать это в __iter__ и __next__.

Вопрос 2:

  • Как мне реализовать этот вложенный словарный цикл в __iter__ и __next__?

Обратите внимание, что я ищу ответ на этот конкретный вопрос, а не на то, «почему не используйте генераторы» или «почему не делайте так / так».

1 Ответ

3 голосов
/ 31 мая 2019

Вопрос 1:

Would the list comprehension just point to the data within the dictionary or would it really copy the data?

Он будет содержать ссылку на списки в словаре

Вопрос 2:

How would I implement this nested dictionary-loop within __iter__and __next__?

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

class Data:
    def __init__(self, input: dict):
        self.dictionary = input
    def __iter__(self):
        return (series_array for series_key, series_array in series.items() for ... in self.dictionary.items())
...