Вы можете поместить все префиксы вставленных ключей к Словарю, поэтому для ключа foo
вы вставили бы f
, fo
и foo
. Вы бы O (1) поиска, но вы бы тратить время на предварительную обработку (O (к), где к является длина ключа), и тратить много памяти:
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's ответ. И, конечно, иметь в виду возможных многочисленных столкновений для коротких префиксов (здесь: "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'}
Я сомневаюсь, что вы можете что-нибудь лучше получения идеальной, как вы не можете вывести хэш ключа от части ключа. Также это оставляет место для двусмысленностей, если два ключа начинаются с того же префикса. – Hyperboreus
Существуют структуры данных, которые могут это сделать, но они недоступны в стандартной библиотеке Python. Например, обрабатывает деревья или двоичные деревья поиска. – delnan
Поскольку вопрос о скорости, я считаю обязанным указать, что 'для ключа в dict_:' намного быстрее, чем 'для ключа в dict_.keys():', поскольку последний строит список ключей. –