具有返回迭代器的查找的Python字典 >我想知道C++的STD::MAP(它是一个排序字典),查找关键字返回一个指向地图中正确位置的迭代器。这意味着您可以查找一个键,然后从那里开始迭代,例如,如果该键实际上是您感兴趣的范围的开始,或者如果您想要“在我的字典中紧跟键之后的项”
是否有其他python dict支持此类功能?在Python2.7+中,您可以使用OrderedDict:具有返回迭代器的查找的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'
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
集合模块中的D4Python本机OrderedDict类不支持从随机选择的键向前推进的操作。还有一些有序字典的其他实现确实支持该操作。其中之一可能满足您的需求:
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.2foo.\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