Исходная ситуация
Допустим, у нас есть словарь, хранящий данные временных рядов в виде:
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__
?
Обратите внимание, что я ищу ответ на этот конкретный вопрос, а не на то, «почему не используйте генераторы» или «почему не делайте так / так».