Python 如何获得;“下一步”;订单中的项目?
我正在使用OrderedDict随机访问列表,但现在希望列表中的下一个项来自我拥有的项:Python 如何获得;“下一步”;订单中的项目?,python,ordereddictionary,Python,Ordereddictionary,我正在使用OrderedDict随机访问列表,但现在希望列表中的下一个项来自我拥有的项: foo = OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) apple = foo['apple'] 我怎样才能只用foo和apple得到香蕉呢?我不寒而栗地想,这在大小列表上会有多慢,但到目前为止我想出的唯一方法是 >>> foo.items()[foo.keys().index('apple
foo = OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
apple = foo['apple']
我怎样才能只用
foo
和apple
得到香蕉呢?我不寒而栗地想,这在大小列表上会有多慢,但到目前为止我想出的唯一方法是
>>> foo.items()[foo.keys().index('apple') + 1]
('banana', 3)
编辑:
这个例子有点做作;我的实际收藏是按日期键入的。如果我今天需要之后的条目
;找到了使用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)
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)])
>>>今天=日期时间.日期(2000,1,30)
>>>foo.items()[foo.keys().index((itertools.dropwhile)(lambda d:d根据您的代码重新编写,我想这样会更好一些:
import collections as co
import datetime as dt
import itertools as it
foo = co.OrderedDict([
(dt.date(2000,1,1), 4),
(dt.date(2000,5,23), 3),
(dt.date(2000,10,1), 2),
(dt.date(2000,12,31), 1)
])
today = dt.date(2000,1,30)
fooiter = it.dropwhile(lambda d: d <= today, foo)
print next(fooiter)
print list(fooiter)
将集合作为co导入
将日期时间导入为dt
按原样导入itertools
foo=co.OrderedDict([
(dt.日期(2000,1,1),4),
(dt.日期(2000,5,23),3),
(dt.日期(2000年10月1日),2),
(dt.日期(2000,12,31),1)
])
今天=日期(2000年1月30日)
fooiter=it.dropwhile(lambda d:d如果您可以访问OrderedICT实现中有意保密的部分:
>>> 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'
>>类别MyOrderedICT(OrderedICT):
…定义下一个_键(self,key):
…next=self.\u OrderedDict\u映射[键][1]
…如果下一个是self.\u OrderedDict\u根目录:
…raise VALUERROR(“{!r}是最后一个键”。格式(键))
…返回下一个[2]
…def第一个_键(自):
…对于自身中的键:返回键
…提升值错误(“OrderedDict()为空”)
...
>>>od=MyOrderedict([('apple',4),('banana',3),('orange',2),('pear',1)])
>>>od.下一键(“苹果”)
“香蕉”
>>>od.下一键(“香蕉”)
“橙色”
>>>od.下一键(“橙色”)
“梨”
>>>od.下一键(“pear”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第5行,在下一个\u键中
ValueError:“pear”是最后一个键
>>>od.第一个_键()
“苹果”
Python3.X
dict.items将返回一个iterable dict view对象,而不是一个列表。我们需要将调用包装到一个列表中,以使索引成为可能:
>>> from collections import OrderedDict
>>>
>>> foo = OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
>>>
>>> def next_item(odic, key):
... return list(odic)[list(odic.keys()).index(key) + 1]
...
>>> next = next_item(foo, 'apple')
>>> print(next, foo[next])
banana 3
OrderedDict
似乎太简单了。也许一个可怕的一行就行了?foo[(lambda keys:keys[(keys.index('pear')+1)%len(keys)](foo.keys())]
非常好,这是我所希望的洞察力。在python 3.4中,OrderedDict
的实现略有改变(请参阅)。链表上的元素现在是虚拟类\u Link
的对象。不访问self.\u OrderedDict\u映射[key][1]
,而应该访问self.\u OrderedDict\u映射[key]。接下来的。在python3.5中,情况似乎发生了更大的变化。OrderedDict的实现从python移到了C。请检查[。此实现将不允许继承_-map,即_-OrderedDict u-map。如果您必须绕过此问题并使用python模块,可以尝试使用py\u coll=import\u fresh_模块('collections',blocked=[''u-collections'))OrderedICT=py_coll.OrderedICT
为什么不在OrderedICT的界面中实现这一点?这似乎是OrderedICT的一个显而易见的用例,令人惊讶的是,它们没有比在我们的代码中迭代整个OrderedICT更简单的导航方式。想知道这背后的原因是什么。