我需要一个字典数据结构,可以存储如下所示的字典:
但问题是,我的代码中需要多次迭代这个数据结构。每次迭代时,我需要保证迭代顺序的正确性,因为这个复杂数据结构中的所有元素都映射到一个一维数组(如果您愿意,可以理解为串行化),因此顺序很重要。我考虑编写一个有序的有序字典,但我不确定这是否是正确的解决方案,因为似乎我可能选择了错误的数据结构。对于我的情况,什么是最适当的解决方案?
更新:
这是我目前想到的:
custom = {1: {'a': np.zeros(10), 'b': np.zeros(100)},
2: {'c': np.zeros(20), 'd': np.zeros(200)}}
但问题是,我的代码中需要多次迭代这个数据结构。每次迭代时,我需要保证迭代顺序的正确性,因为这个复杂数据结构中的所有元素都映射到一个一维数组(如果您愿意,可以理解为串行化),因此顺序很重要。我考虑编写一个有序的有序字典,但我不确定这是否是正确的解决方案,因为似乎我可能选择了错误的数据结构。对于我的情况,什么是最适当的解决方案?
更新:
这是我目前想到的:
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]
比原始字典迭代效率更低。这是真的吗?我该如何改进?
__iter__
和__next__
方法来实现这一点,但我失败了。我还想问你能否解释一下你写的代码,因为对我来说那是相当高级的Python。 - aaragonfor i in custom:
,并且由于您正在使用有序字典,因此遍历字典时顺序始终相同。 您认为通过重写__iter__
和next()
可以实现这一点吗? - aaragon__iter__
和next()
方法进行迭代,这正确吗? - aaragon