Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获得;“下一步”;订单中的项目?_Python_Ordereddictionary - Fatal编程技术网

Python 如何获得;“下一步”;订单中的项目?

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

我正在使用OrderedDict随机访问列表,但现在希望列表中的下一个项来自我拥有的项:

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更简单的导航方式。想知道这背后的原因是什么。