Die geordnete dict in der Standard-Bibliothek, nicht diese Funktionalität bieten. Obwohl Bibliotheken existierten für ein paar Jahre, bevor collections.OrderedDict, die diese Funktionalität (und bieten im Wesentlichen eine Ober von OrderedDict): voidspace odict und ruamel.ordereddict (ich bin der Autor des letzteren Pakets, das eine Neuimplementierung von 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 können Sie die bestellten Eingangs Anforderung entspannen (AFAIK nicht Ableitung von dict fragen, ob seine Schlüssel bestellt werden (würde gute Ergänzung ruamel.ordereddict collection.OrderedDicts) zu erkennen):
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]
Wenn Sie (oder müssen) innerhalb der standa bleiben wollen rd Bibliothek können Sie collections.OrderedDict
‚s __getitem__
sublass:
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]
natürlich Sie Martijn oder des Jimmys kürzere Versionen verwenden könnte die tatsächliche Scheibe zu erhalten, die Rückkehr braucht:
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]
oder wenn Sie nur wollen, sich in Schale werfen alle vorhandenen OrderedDict
s ohne 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]
Ist das O (n)? es scheint, als ob diese Operation nicht sein muss. –