ho bisogno di una struttura di dati che memorizzano dizionario dizionari come si vede qui sotto:dizionario ordinato di dizionari ordinati in pitone
custom = {1: {'a': np.zeros(10), 'b': np.zeros(100)},
2: {'c': np.zeros(20), 'd': np.zeros(200)}}
Ma il problema è che io iterare su questa struttura dati molte volte nel mio codice. Ogni volta che lo iterato, ho bisogno che l'ordine di iterazione sia rispettato perché tutti gli elementi di questa complessa struttura di dati sono mappati su un array 1D (serializzato se volete), e quindi l'ordine è importante. Ho pensato di scrivere uno dict
ordinato del dict
ordinato per quella materia, ma non sono sicuro che questa sia la soluzione giusta in quanto sembra che stia scegliendo la struttura dei dati sbagliata. Quale sarebbe la soluzione più adeguata per il mio caso?
UPDATE
Quindi questo è quello che mi è venuto in mente finora:
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())
posso scorrere le volte che voglio in questa struttura ordinata, e ho implementato __call__
così posso scorrere le dimensioni inferiori. Non mi piace il fatto che se non c'è una dimensione inferiore presente nell'elenco, non mi dà alcun errore. Ho anche la sensazione che ogni volta che chiamo return self[self.d][self.etype][self.idx-1]
sia meno efficiente dell'iterazione originale sul dizionario. È vero? Come posso migliorare questo?
Non posso usare questo perché 1 può o non può essere presente, e lo stesso vale per 0 e 2. – aaragon
Ah ok, quindi in realtà hai bisogno delle chiavi in "dict" esterno - non importa, scusa per l'equivoco! – Lisa
@aaragon Ho modificato la risposta per conservare gli indici che erano le chiavi del tuo 'dict 'esterno e ho impostato tutti gli elementi non disponibili su' None'. – Lisa