Il dict ordinata nella libreria standard, non prevede che la funzionalità. Anche se le librerie esistevano per alcuni anni prima di collections.OrderedDict che hanno questa funzionalità (e forniscono essenzialmente un superset di OrderedDict): voidspace odict e ruamel.ordereddict (sono l'autore di quest'ultimo pacchetto, che è una reimplementazione di odict in C):
from odict import OrderedDict as odict
p = odict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
print p[1:3]
In ruamel.ordereddict ci si può rilassare il requisito d'ingresso ordinata (per quanto ne so non si può chiedere derivato del dict se le sue chiavi sono ordinate (sarebbe buona aggiunta al ruamel.ordereddict riconoscere collection.OrderedDicts)):
from ruamel.ordereddict import ordereddict
q = ordereddict(o, relax=True)
print q[1:3]
r = odict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
print r[1:3]
Se si desidera (o si deve) rimanere all'interno dello standa biblioteca Rd si può sublass collections.OrderedDict
s' __getitem__
:
class SlicableOrderedDict(OrderedDict):
def __getitem__(self, k):
if not isinstance(k, slice):
return OrderedDict.__getitem__(self, k)
x = SlicableOrderedDict()
for idx, key in enumerate(self.keys()):
if k.start <= idx < k.stop:
x[key] = self[key]
return x
s = SlicableOrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
print s[1:3]
naturalmente è possibile utilizzare versioni più corte di Martijn o Jimmy per ottenere la fetta reale che ha bisogno di tornare:
from itertools import islice
class SlicableOrderedDict(OrderedDict):
def __getitem__(self, k):
if not isinstance(k, slice):
return OrderedDict.__getitem__(self, k)
return SlicableOrderedDict(islice(self.viewitems(), k.start, k.stop))
t = SlicableOrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
print t[1:3]
o se volete semplicemente abbellire tutte le esistenti OrderedDict
s senza subclassing:
def get_item(self, k):
if not isinstance(k, slice):
return OrderedDict._old__getitem__(self, k)
return OrderedDict(islice(self.viewitems(), k.start, k.stop))
OrderedDict._old__getitem__ = OrderedDict.__getitem__
OrderedDict.__getitem__ = get_item
u = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
print u[1:3]
È questo O (n)? sembra che questa operazione non debba essere. –