如何获得OrderedDict中的"下一个"项目?

Joh*_*Mee 10 python ordereddictionary

我正在使用OrderedDict随机访问列表,但现在想要next列表中的项目来自我拥有的项目:

foo = OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
apple = foo['apple']
Run Code Online (Sandbox Code Playgroud)

我如何使用fooapple

小智 7

如果您可以访问有意保密的OrderedDict实现的那些部分:

>>> class MyOrderedDict(OrderedDict):
...     def next_key(self, key):
...             next = self._OrderedDict__map[key][1]
...             if next is self._OrderedDict__root:
...                     raise ValueError("{!r} is the last key".format(key))
...             return next[2]
...     def first_key(self):
...             for key in self: return key
...             raise ValueError("OrderedDict() is empty")
... 
>>> od = MyOrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
>>> od.next_key("apple")
'banana'
>>> od.next_key("banana")
'orange'
>>> od.next_key("orange")
'pear'
>>> od.next_key("pear")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in next_key
ValueError: 'pear' is the last key
>>> od.first_key()
'apple'
Run Code Online (Sandbox Code Playgroud)

  • 为什么不在OrderedDict的界面中实现?对于OrderedDict而言,这似乎是一个明显的用例,令人惊讶的是,它们没有更简单的导航方式,而是在代码中迭代整个OrderedDict.想知道这可能是什么原因. (8认同)

Joh*_*Mee 6

我不禁想到这将在一个大小的列表上有多缓慢,但到目前为止,我想出的唯一方法......

>>> foo.items()[foo.keys().index('apple') + 1]
('banana', 3)
Run Code Online (Sandbox Code Playgroud)

编辑:

这个例子有点做作; 我的实际收藏是按日期键入的.如果我需要之后的条目today; 使用dropwhile找到了一个解决方案......

>>> foo = OrderedDict([(datetime.date(2000,1,1), 4), (datetime.date(2000,5,23), 3), datetime.date(2000,10,1), 2), (datetime.date(2000,12,31), 1)])
>>> today = datetime.date(2000,1,30)
>>> foo.items()[foo.keys().index((itertools.dropwhile(lambda d: d<today, foo)).next())]
(datetime.date(2000, 5, 23), 3)
Run Code Online (Sandbox Code Playgroud)

相当满口.