Я застрял в проблеме с рекурсивной функцией.
hints = ['one','two','three', 'four']
firstCity = 'ROME'
dictionary = { 'ROMEone' : { 'PARIS' : {'hello'} , 'CAIRO': {'money'}, 'MOSCOW': {'racing'} },
'CAIROtwo': { 'MILAN' : {'in'}},
'PARIStwo': { 'BERLIN' : {'how'} , 'CANCUN' : {'im'} },
'MOSCOWtwo': { 'AMSTERDAM' : {'cars'} },
'BERLINthree': { 'AMSTERDAM' : {'are'} },
'AMSTERDAMthree' : { 'MILAN' : {'are'} },
'MILANthree' : { 'PARIS' : {'the'} },
'CANCUNthree' : { 'LONDON' : {'john'}},
'AMSTERDAMfour': { 'MILAN' : {'you'} },
'MILANfour': { 'LONDON' : {'fast'} },
'PARISfour': { 'CANCUN' : {'bank'} },
'LONDONfour': { 'FLORENCE' : {'smith'}} }
Цель функции — искать в словаре, начиная с «firstCity», и находить все возможные фразы, которые можно извлечь из словаря.
для каждого элемента словаря есть 2 информации: назначение (куда смотреть) и слово (для построения искомой фразы)
Результат должен быть:
[ ["hello how are you" , "MILAN"],
["hello im john smith", 'FLORENCE"],
["money in the bank", "CANCUN"],
["racing cars are fast", "LONDON"] ]
до сих пор я придумал это решение, но оно не работает должным образом, могу ли я попросить несколько советов, как это решить? пожалуйста!
def ex(dictionary, hints, firstCity, words = []):
for key in dictionary:
if key == (firstCity + hints[0]):
for destination in dictionary[key]:
firstCity = destination
word = getValue(dictionary[key][destination])
#getValue simply get the value from the set
words.append(word)
if hints[1:] == []:
return words
ex(dictionary, hints[1:], firstCity,words)
return words
def getValue(st):
for el in st:
if len(st) == 1:
return el
Результатами функции со значениями будут:
['hello','how','are','you','are','fast','the','bank','im','john','smith','money','in','the','bank','racing','cars','are','fast','the','bank']
Что это за ключи верхнего уровня? Является ли ROMEone
на самом деле строкой "ROMEone"
или это имя переменной, привязанное к какому-то объекту другого типа? Какова семантика различных уровней вложенности в словаре? Это кажется действительно неудобной структурой данных для того, что вы хотите.
поскольку @quamrana мягко сказал, что мне нужно обновить вопрос, он был недостаточно ясен.
Хотя я до сих пор не вижу, как вы что-то называете. Каков ваш вклад?
вход для него - это firstCity = 'ROME' и список подсказок ['один','два','три', 'четыре'] и, очевидно, словарь
Вы можете использовать рекурсию с генератором:
hints = ['one','two','three', 'four']
d = {'ROMEone': {'PARIS': {'hello'}, 'CAIRO': {'money'}, 'MOSCOW': {'racing'}}, 'CAIROtwo': {'MILAN': {'in'}}, 'PARIStwo': {'BERLIN': {'how'}, 'CANCUN': {'im'}}, 'MOSCOWtwo': {'AMSTERDAM': {'cars'}}, 'BERLINthree': {'AMSTERDAM': {'are'}}, 'AMSTERDAMthree': {'MILAN': {'are'}}, 'MILANthree': {'PARIS': {'the'}}, 'CANCUNthree': {'LONDON': {'john'}}, 'AMSTERDAMfour': {'MILAN': {'you'}}, 'MILANfour': {'LONDON': {'fast'}}, 'PARISfour': {'CANCUN': {'bank'}}, 'LONDONfour': {'FLORENCE': {'smith'}}}
def get_vals(s, c = [], t=[]):
if (k:=next(filter(lambda x:x not in t, hints), None)):
for a, [b] in d.get(f'{s}{k}', {}).items():
yield from get_vals(a, c=c+[b], t=t+[k])
else:
yield c+[s]
print(list(get_vals('ROME')))
Выход:
[['hello', 'how', 'are', 'you', 'MILAN'],
['hello', 'im', 'john', 'smith', 'FLORENCE'],
['money', 'in', 'the', 'bank', 'CANCUN'],
['racing', 'cars', 'are', 'fast', 'LONDON']]
Большое спасибо за вашу помощь!
Пожалуйста, обновите свой вопрос, указав фактический ввод, который вы используете, и фактический вывод, который вы видите.