我需要一个存储字典的字典数据结构,如下所示:
custom = {1: {'a': np.zeros(10), 'b': np.zeros(100)}, 2: {'c': np.zeros(20), 'd': np.zeros(200)}}
但问题是我在代码中多次迭代这个数据结构.每次迭代它时,我都需要遵守迭代的顺序,因为这个复杂数据结构中的所有元素都映射到一维数组(如果你愿意,可以序列化),因此顺序很重要.我考虑过编写一个有序dict
的订单dict
,但我不确定这是正确的解决方案,因为我似乎可能选择了错误的数据结构.对我的案子来说,最合适的解决办法是什么?
UPDATE
所以这就是我到目前为止所提出的:
class Test(list): def __init__(self, *args, **kwargs): super(Test, self).__init__(*args, **kwargs) for k,v in args[0].items(): self[k] = OrderedDict(v) self.d = -1 self.iterator = iter(self[-1].keys()) self.etype = next(self.iterator) self.idx = 0 def __iter__(self): return self def __next__(self): try: self.idx += 1 return self[self.d][self.etype][self.idx-1] except IndexError: self.etype = next(self.iterator) self.idx = 0 return self[self.d][self.etype][self.idx-1] def __call__(self, d): self.d = -1 - d self.iterator = iter(self[self.d].keys()) self.etype = next(self.iterator) self.idx = 0 return self def main(argv=()): tst = Test(elements) for el in tst: print(el) # loop over a lower dimension for el in tst(-2): print(el) print(tst) return 0 if __name__ == "__main__": sys.exit(main())
我可以在这个有序的结构中迭代多次,我实现了__call__
所以我可以遍历较低的维度.我不喜欢这样的事实:如果列表中没有较低的维度,它不会给我任何错误.我也有这种感觉,每次调用时return self[self.d][self.etype][self.idx-1]
都比字典上的原始迭代效率低.这是真的?我怎样才能改善这个?