带有查找的Python字典,返回迭代器

时间:2011-11-01 17:45:29

标签: python dictionary map sorteddictionary

我想念C ++ std :: map(它是一个排序字典)的东西是查找一个键返回指向地图中正确位置的迭代器。这意味着您可以查找密钥,然后从那里开始迭代,例如如果密钥实际上是您感兴趣的范围的开头,或者您想要“在密钥后面的字典中的项目”。

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

5 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

在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或更低版本,您可以使用OrderedDict recipe

答案 2 :(得分:0)

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

print my_dict

keys = my_dict.keys()
keys.sort()
start_index = keys.index('b')

for key in keys[start_index:]:
    print key, my_dict[key]

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

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

b 2

c 3

d 4

答案 3 :(得分:0)

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

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

打印

('c', 5)

答案 4 :(得分:0)

Python sortedcontainers module提供了SortedDict类型,可以通过多种方式支持此功能。

SortedDict.irange返回一个切片映射键的迭代器:

from sortedcontainers import SortedDict
values = SortedDict(enumerate(range(10)))
assert list(values.irange(5, 8)) == [5, 6, 7, 8

SortedDicts也是可索引的:

assert values.iloc[4] == 4
assert values.iloc[2:5] == [2, 3, 4]
assert values.index(7) == 7

iloc属性是通过索引有效切片或获取项目的代理。 index方法的作用相反。

SortedContainers项目includes benchmarks和广泛的测试。测试涵盖了100%的项目,压力在每次主要版本发布前持续数小时。