@Rild2

Что нужно сделать, чтобы рекурсия работала для каждого элемента массива?

В общем, есть такая рекурсия и небольшой словарь списков:
def rec(el, l, d):
    if el in l:
        return True
    else:
        for i in l:
            if i in d.keys():
                return rec(el, d[i], d)

        
diction = {'city': ['zoo', 'park', 'cafe'], 'zoo': ['tiger', 'zebra'],
                    'park': ['squirrel', 'dog'], 'cafe': 'people'}

print('Yes' if rec('people', diction['city'], diction) else 'No')  # No

Мне нужно каким-то образом понять, имеются ли "люди" в городе. Для этого я написал рекурсию, которая, как мне кажется, должна справиться со своей задачей.

Но всё рушится сразу же после первого элемента - "зоопарка". В нём людей нет, и рекурсия соответственно возвращает None. И вроде бы я должен переходить к следующему элементу в словаре - к парку, но этот None продолжает передаваться по цепочке вверх и в итоге вся функция возвращает None.

Что нужно добавить, чтобы всё заработало?
  • Вопрос задан
  • 57 просмотров
Решения вопроса 1
@Rild2 Автор вопроса
Извиняюсь за возможное недопонимание - мне нужно было найти не people в конкретном списке, а именно что понять, как через рекурсию обходить все значения в массиве. К счастью, я уже разобрался, это делается через временную переменную:
def rec(el, l, d):
    if el in l:
        return True
    else:
        for i in l:
            if i in d.keys():
                t = rec(el, d[i], d)  # Вот через эту
                if t != None:  # Если в рекурсии для одного списка не нашло значение
                     return t  # то я просто его отбрасываю и ищу дальше
                   

        
diction = {'city': ['zoo', 'park', 'cafe'], 'zoo': ['tiger', 'zebra'],
                    'park': ['squirrel', 'dog'], 'cafe': 'people'}

print('Yes' if rec('people', diction['city'], diction) else 'No')  # Yes
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
diction = {'city': ['zoo', 'park', 'cafe'], 'zoo': ['tiger', 'zebra'],
                    'park': ['squirrel', 'dog'], 'cafe': 'people'}


def detect_root(in_dict):
    for key in in_dict.keys():
        if key in set(in_dict.keys()) - set(in_dict[key]):
            return key


def detect_person_place(in_dict, person):
    for place in in_dict[detect_root(in_dict)]:
        if person in in_dict[place]:
            return place


person = 'people'
print('Yes' if person in diction.values() else 'No')
if person in diction.values():
    print(detect_person_place(diction, person))

Но рекурсию тут не знаю как применить… ну можно, но это какое-то извращение.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы