具有返回迭代器的查找的Python字典 >我想知道C++的STD::MAP(它是一个排序字典),查找关键字返回一个指向地图中正确位置的迭代器。这意味着您可以查找一个键,然后从那里开始迭代,例如,如果该键实际上是您感兴趣的范围的开始,或者如果您想要“在我的字典中紧跟键之后的项”

具有返回迭代器的查找的Python字典 >我想知道C++的STD::MAP(它是一个排序字典),查找关键字返回一个指向地图中正确位置的迭代器。这意味着您可以查找一个键,然后从那里开始迭代,例如,如果该键实际上是您感兴趣的范围的开始,或者如果您想要“在我的字典中紧跟键之后的项”,python,dictionary,map,sorteddictionary,Python,Dictionary,Map,Sorteddictionary,是否有其他python dict支持此类功能?在Python2.7+中,您可以使用OrderedDict: import collections import itertools foo=collections.OrderedDict((('a',1),('b',2),('c',3))) for key,value in itertools.dropwhile(lambda x: x[0]!='b',foo.iteritems()): print(key,value) 屈服 ('b'

是否有其他python dict支持此类功能?

在Python2.7+中,您可以使用OrderedDict:

import collections
import itertools

foo=collections.OrderedDict((('a',1),('b',2),('c',3)))
for key,value in itertools.dropwhile(lambda x: x[0]!='b',foo.iteritems()):
    print(key,value)
屈服

('b', 2)
('c', 3)
对于Python2.6或更低版本,可以使用

=================================

{'a':1,'c':3,'b':2,'d':4}

b 2

C3


集合模块中的D4

Python本机OrderedDict类不支持从随机选择的键向前推进的操作。还有一些有序字典的其他实现确实支持该操作。其中之一可能满足您的需求:

如果您不需要在任意位置插入和删除O(log n),您可以使用键值对列表,并使用来查找项目:

d = [("a", 3), ("b", 4), ("c", 5)]
i = bisect.bisect(d, ("b",))
print d[i + 1]
印刷品

('c', 5)
提供了一种以多种方式支持此功能的类型

返回分割映射键的迭代器:

from sortedcontainers import SortedDict
values = SortedDict(enumerate(range(10)))
assert list(values.irange(5, 8)) == [5, 6, 7, 8
分类的数据也可转位:

assert values.iloc[4] == 4
assert values.iloc[2:5] == [2, 3, 4]
assert values.index(7) == 7
iloc
属性是按索引高效切片或获取项目的代理。
index
方法的工作原理正好相反


分拣容器项目和广泛测试。测试覆盖了100%的项目,在每个主要版本发布之前,压力会持续数小时。

,这就是您要寻找的吗?您可以深入OrderedICT实施来实施解决方案,但实施本身取决于版本,将来可能不总是有办法做到这一点。FWIW,Python2.7
foo.\u OrderedDict\uuuuuu map[somekey][1][2]
和3.2
foo.\u OrderedDict\uuu map[somekey]。下一步。key
将分别给您以下
somekey
的键,但不要这样做。这样,您将得到O(n)查找时间。迭代
foo
中的项无论如何都是O(n),所以我不认为在O(1)时间内查找迭代器的开头会提高总体时间复杂度。(O(1)可以使用
foo.\u OrderedDict\u\u map
进行查找,但这取决于实现细节。)Python的本机
OrderedDict
类也不会将其内容保持在键排序顺序。我认为OP需要研究所谓的
sortedict
的实现。对给定键函数的数据进行排序并将其插入到Orderedict中进行查找和遍历是很简单的:除非添加新键,否则效果很好,然后需要求助(尽管sortedict实现也必须执行insort()在每次插入或执行查找时(在查找之前懒洋洋地执行完整排序)。
assert values.iloc[4] == 4
assert values.iloc[2:5] == [2, 3, 4]
assert values.index(7) == 7