Można umieścić wszystkie prefiksy wstawionej klucze do dict, więc dla klucza foo
byś wstawić f
, fo
i foo
. Trzeba byłoby O (1) odnośnika, ale można spędzić czas na przerób (O (K), gdzie K jest kluczem długości) i tracić dużo pamięci:
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)
do codziennego użytku pójdę (i idę) z metodą w odpowiedzi arshajii's. I oczywiście mieć na uwadze ewentualne kolizje dla wielu krótkich przedrostków (tu: "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'}
wątpię można acheive nic lepszego jak nie można wywnioskować hash klucza z części klucza. Również pozostawia to pole do niejednoznaczności, jeśli dwa klucze zaczynają się od tego samego prefiksu. – Hyperboreus
Istnieją struktury danych, które mogą to zrobić, ale nie są one dostępne w standardowej bibliotece Python. Przykładowo lub drzewa wyszukiwania binarnego. – delnan
Ponieważ pytanie dotyczy prędkości, czuję się zobowiązany zwrócić uwagę, że 'dla klucza w dyktafonie:' jest znacznie szybsze niż 'dla klucza w dict_.keys():', ponieważ ten drugi tworzy listę kluczy. –