假设我有以下代码:
import collections
d = collections.OrderedDict()
d['foo'] = 'python'
d['bar'] = 'spam'
是否有办法以编号的方式访问这些项目,例如:
d(0) #foo's Output
d(1) #bar's Output
发布于 2012-04-07 20:46:29
如果它是一个OrderedDict()
,您可以通过获得(键,值)对的元组来轻松地访问元素,如下所示
>>> import collections
>>> d = collections.OrderedDict()
>>> d['foo'] = 'python'
>>> d['bar'] = 'spam'
>>> d.items()
[('foo', 'python'), ('bar', 'spam')]
>>> d.items()[0]
('foo', 'python')
>>> d.items()[1]
('bar', 'spam')
用于Python3.x的注释
dict.items
将返回一个可迭代dict视图对象而不是一个列表。为了使索引成为可能,我们需要将调用包装到列表中。
>>> items = list(d.items())
>>> items
[('foo', 'python'), ('bar', 'spam')]
>>> items[0]
('foo', 'python')
>>> items[1]
('bar', 'spam')
发布于 2014-04-08 04:29:40
您是否必须使用OrderedDict,或者您是否特别希望以某种方式排序的类似地图的类型具有快速的位置索引?如果是后者,则考虑Python的多个排序迪克类型之一(它根据键排序顺序对键值对排序)。一些实现还支持快速索引。例如,分类容器项目有一个用于此目的的SortedDict类型。
>>> from sortedcontainers import SortedDict
>>> sd = SortedDict()
>>> sd['foo'] = 'python'
>>> sd['bar'] = 'spam'
>>> print sd.iloc[0] # Note that 'bar' comes before 'foo' in sort order.
'bar'
>>> # If you want the value, then simple do a key lookup:
>>> print sd[sd.iloc[1]]
'python'
发布于 2014-06-29 19:38:10
这里有一个特例,如果您想要在OrderedDict中第一个条目(或接近它),而不创建一个列表。(这已更新为Python 3):
>>> from collections import OrderedDict
>>>
>>> d = OrderedDict()
>>> d["foo"] = "one"
>>> d["bar"] = "two"
>>> d["baz"] = "three"
>>> next(iter(d.items()))
('foo', 'one')
>>> next(iter(d.values()))
'one'
(当你第一次说"next()“时,它的意思就是”第一次“。)
在我的非正式测试中,带有小next(iter(d.items()))
的OrderedDict只比items()[0]
快一点点。OrderedDict为10,000个条目,next(iter(d.items()))
比items()[0]
快200倍。
但是--如果您只保存项目()列表一次,然后大量使用该列表,这可能会更快。或者,如果您重复{创建一个items()迭代器并将其遍历到您想要的位置},则可能会慢一些。
https://stackoverflow.com/questions/10058140
复制相似问题