Python словарь с поиском, который возвращает итератор - PullRequest
2 голосов
/ 01 ноября 2011

Что-то, чего мне не хватает в C ++ std :: map (это отсортированный словарь), это то, что поиск ключа возвращает итератор, указывающий на правильное местоположение на карте.Это означает, что вы можете найти ключ, а затем начать итерацию оттуда, например, если ключ на самом деле является началом интересующего вас диапазона или если вы хотите «элемент в моем словаре сразу после ключа».

Есть ли какой-нибудь другой python dict, который поддерживает такую ​​функциональность?

Ответы [ 5 ]

3 голосов
/ 01 ноября 2011

Собственный класс Python OrderedDict в модуле коллекций не поддерживает операцию по продвижению вперед от произвольно выбранного ключа.Существуют и другие реализации упорядоченных словарей, которые поддерживают эту операцию.Один из них может удовлетворить ваши потребности:

2 голосов
/ 01 ноября 2011

В 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.

0 голосов
/ 13 октября 2015

Модуль Python sortedcontainers *1001* предоставляет тип 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 включает в себя тесты и расширенное тестирование. Тесты охватывают 100% проекта, а стрессовые тесты проводятся в течение нескольких часов перед каждым основным выпуском.

0 голосов
/ 02 ноября 2011

Если вам не нужно вставлять и удалять O (log n) в произвольных позициях, вы можете использовать список пар ключ-значение и использовать bisect.bisect() для поиска элементов:

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

печать

('c', 5)
0 голосов
/ 01 ноября 2011
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

с 3

д 4

...