lubię daje gotowych odpowiedzi - ale myślę, że zajęłoby znacznie więcej czasu, aby wyjaśnić w języku angielskim -
Podstawowym pomysłem sprowadzić obiektów droga numpy nie jest dostosowanie sposobu __getitem__
- przecinek oddzielone wartości są prezentowane w metodzie jako krotki - ty po prostu użyj wartości w krotce jako indeksy do zagnieżdżonych słowników w sekwencji.
Poza tym, Python wykonane łatwo stworzyć w pełni funkcjonalne DICT jako ekwiwalent z tych collections.abc klas: jeśli wdrożenie minimalny zestaw metod, gdy inhetiring z collections[.abc].MutableMapping
wszystkie słowniku zachowanie jest emulowane - (__getitem__, __setitem__, __delitem__, __iter__, __len__
) - Wtedy, to to kwestia właściwej iteracji poprzez kluczowe komponenty i tworzenia nowych, pustych, zwykłych słowników do przechowywania potrzebnych wartości.
try:
from collections import MutableMapping
except ImportError:
# Python3 compatible import
from collections.abc import MutableMapping
class NestedDict(MutableMapping):
def __init__(self, *args, **kw):
self.data = dict(*args, **kw)
def get_last_key_levels(self, key, create=False):
if not isinstance(key, tuple):
key = (key,)
current_data = self.data
for subkey in key:
previous = current_data
current_data = current_data[subkey] if not create else current_data.setdefault(subkey, {})
return previous, current_data, subkey
def __getitem__(self, key):
previous, current_data, lastkey = self.get_last_key_levels(key)
return current_data
def __setitem__(self, key, value):
previous, current_data, lastkey = self.get_last_key_levels(key, True)
previous[lastkey] = value
def __delitem__(self, key):
previous, current_data, lastkey = self.get_last_key_levels(key)
del previous[lastkey]
def __iter__(self):
return iter(self.data)
def __len__(self):
return len(self.data)
def __repr__(self):
return "NestedDict({})".format(repr(self.data))
I jesteś ustawiony, aby przejść:
>>> from nesteddict import NestedDict
>>> x = NestedDict(a={})
NestedDict({'a': {}})
>>> x["a", "b"] = 10
>>> x
NestedDict({'a': {'b': 10}})
>>> x["a", "c", "e"] = 25
>>> x
NestedDict({'a': {'c': {'e': 25}, 'b': 10}})
>>> x["a", "c", "e"]
25
>>>
Należy pamiętać, że jest to realizacja na wysokim poziomie, który będzie po prostu działać, ale trzeba będzie nigdzie w pobliżu poziomu optymalizacji można uzyskać na NumPy z tym - wręcz przeciwnie. Jeśli będziesz potrzebował wykonać szybkie operacje na danych w tych obiektach, być może powinieneś sprawdzić "cython" - lub uciekniesz się do pomysłu transponowania kluczy dyktujących na klucze nuemric i użyj NumPy (ten pomysł może wciąż wybierać pomysły z tej odpowiedzi)
Czy rzeczywiście potrzebujesz danych do przechowywania w strukturze zagnieżdżonej? Możesz po prostu użyć dyktatury, której kluczami są krotki. – BrenBarn
@BrenBarn, który mógłby użyć _a lot_ pamięci – 0x539
zawsze możesz utworzyć klasę kontenerów, która przeciąża '__getitem__', aby to zrobić, ponieważ nie można używać krotek jako indeksów w zagnieżdżonych dyktach. – 0x539