Подтвердить что ты не робот

Самый быстрый способ поиска python dict с частичным ключевым словом

Каков самый быстрый способ определить, содержит ли dict ключ, начинающийся с конкретной строки? Можем ли мы лучше, чем линейные? Как мы можем достичь операции O (1), когда мы знаем только начало ключа?

Вот текущее решение:

for key in dict.keys():
    if key.start_with(str):
        return True
return False
4b9b3361

Ответ 1

Без предварительной обработки dict, O(n) - лучшее, что вы можете сделать. Это не должно быть сложным, хотя:

any(key.startswith(mystr) for key in mydict)

(Не используйте dict и str как имена переменных, это уже имена двух встроенных функций.)

Если вы можете предварительно обработать dict, подумайте о том, чтобы положить ключи в дерево префикса (aka trie). Существует даже реализация Python в статье в Википедии.

Ответ 2

Вы можете поместить все префиксы вставленных ключей в dict, поэтому для клавиши foo вы должны вставить f, fo и foo. У вас был бы поиск O (1), но вы бы потратили время на предварительную обработку (O (k), где k - длина ключа) и теряете массу памяти:

def insert_with_prefixes(key, value, dict_):
  prefixes = (key[:i+1] for i in xrange(len(key)))
  dict_.update((prefix, value) for prefix in prefixes)

Для повседневного использования я пошел (и я пошел) с помощью метода в ответе arshajii. И, конечно, иметь в виду возможные столкновения для коротких префиксов (здесь: "h"):

>>> a = {}
>>> insert_with_prefixes('hello', 'world', a)
>>> insert_with_prefixes('homo', 'sapiens', a)
>>> a
{'h': 'sapiens', 'hom': 'sapiens', 'homo': 'sapiens', 'ho': 'sapiens', 
 'hel': 'world', 'hell': 'world', 'hello': 'world', 'he': 'world'}