Python словарь с несколькими значениями
вопрос таков.
Я пишу небольшую программу "Голосовой Ассистент" на Python. Столкнулся с проблемой создания словаря с командами. Слева на картинке - строка с тем, что человек говорит в микрофон, справа - функция, которая должна выполниться после сказанного. Как видно на изображении, для каждой вариации словосочетаний нужно вручную прописывать одну и ту же функцию, которая будет выполняться. В связи с этим вопрос, можно ли как-то совместить все эти словосочетания в один список или что-то иное, чтобы они раз прописать функцию, которая будет выполняться, не писав при этой её каждый раз.
Пробовал вот так:
Искал в инете, но нигде толком и не нашел, как сделать такой словарь. Пробовал списком:
Но в таком случае непонятно, как выявлять кусок из списка и как вызывать потом функцию.
Кто поможет, буду премного благодарен. (Скорее всего я просто тупой, и тут всё очень просто)
Ответы (3 шт):
Вариантов как это сделать есть несколько. Можно использовать ваш пример со второго скрина - сделать ключ словаря кортежем вариантов:
def find_in_dict(dic, text):
for key in dic:
if text in key:
return dic[key]
return None
dic = {
('раз','два','три'): 'одна команда',
('четыре','пять','шесть'): 'другая команда'
}
assert find_in_dict(dic, 'два') == 'одна команда'
assert find_in_dict(dic, 'шесть') == 'другая команда'
assert find_in_dict(dic, 'семь') == None
У меня для примера значения словаря это строки, но это только для примера, чтобы не писать заглушки функций.
Этот вариант будет работать медленнее, чем если сделать "нормальный" словарь из одиночных ключей, так что если производительность будет проблемой, можно развернуть словарь с кортежем в словарь с одиночными значениями и пользоваться им:
norm_dic = {x:v for k,v in dic.items() for x in k}
print(norm_dic)
Вывод:
{
'раз': 'одна команда',
'два': 'одна команда',
'три': 'одна команда',
'четыре': 'другая команда',
'пять': 'другая команда',
'шесть': 'другая команда'
}
def foo():
print('foo')
def bar():
print('bar')
commands = [
(['a', 'b', 'c'], foo),
(['x', 'y', 'z'], bar)
]
dct = {txt : func for txts, func in commands for txt in txts}
В результате каждое словосочетание будет указывать на нужную функцию.
Ну я могу предложить DialogFlow
Или использовать такую идею:
def func1():
print('Функция: func1')
def func2():
print('Функция: func2')
def func3():
print('Функция: func3')
commands = {'func1': func1,
'func2': func2,
'func3': func3}
commands_list = {'func1': ['word1', 'word1.1', 'word1.2'],
'func2': ['word2', 'word2.1', 'word2.2'],
'func3': ['word3', 'word3.1', 'word3.2']}
word = 'word3'
for el_key in commands_list:
for el_com in commands_list[el_key]:
if word == el_com:
commands[el_key]()


