Здесь у вас есть два возможных решения - первое не имеет сложности O (1), но, вероятно, вы захотите go:
Мы можем попробовать построить дерево и сделать поиск таким образом - по сути, так:
Вы могли бы иметь такой вид, что mydict выглядит так:
test_dict = {
'A': {
'B': {
'C': 0,
'E': 1
}
},
'E': {
'F': 1
}
}
def get_recursive_values(mydict):
results = []
for key in mydict:
if isinstance(mydict[key], dict):
results.extend(get_recursive_values(mydict[key]))
else:
results.append(mydict[key])
return results
def search(mydict, search_text):
components = search_text.split(' ')
if components[0] in mydict:
next_res = mydict[components[0]]
if isinstance(next_res, dict):
if len(components) == 1:
return get_recursive_values(next_res)
return search(next_res, " ".join(components[1:]))
else:
return [mydict[components[0]]]
raise KeyError(components[0])
Возможно, это можно было бы написать немного лучше, но это сработает для вас - попробуйте позвонить search(test_dict, 'A B')
и вы получите оба результата.
Другим потенциальным решением было бы, если вам не нужно время вставки, иметь все значения для всех различных клавиш. это может показаться немного нелепым, но вы получите значения за O (1), но время вставки будет большим - т.е.
'A': [0, 1],
'A B': [0, 1],
'A B C': [0],
'A B E': [1],
'E': [1],
'E F': [1]
}
def insert(mydict, key, value):
for k in mydict:
if k.startswith(key):
mydict[k].append(value)
mydict[key] = [value]