Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
11 / 11 / 2
Регистрация: 30.03.2010
Сообщений: 199

Обход данных

23.04.2021, 10:28. Показов 2203. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Устал биться с рекурсией. Возможно кто-то уже делал подобное. Суть задачи. в программу вводятся данные о наследовании. Например:
4 # Колво вводимых элементов
A # Главный предок
B : A # B наследуется от А
C : A # С наследуется от А
D : B C # D наследуется от B и С

Затем в следующих данных вводится запрос является ли такой-то класс 1 предком класса 2:
4# Колво искомых запросов
A B #Является ли А предком класса В. Ответ YES
B D #Является ли В предком класса D. Ответ YES
C D #Ответ YES
D A #Ответ NO

Также входные данные могут быть такие:
A X
/|\ / \
B C Y Z
\| \ /
D V
/ \ \
E F W
\
G

lst_mro = [ # список введённых строк
'G : F', # сначала отнаследуем от F, потом его объявим, корректный алгоритм все равно правильно обойдёт граф, независимо что было раньше: наследование или объявление
'A',
'B : A',
'C : A',
'D : B C',
'E : D',
'F : D',
# а теперь другая ветка наследования
'X',
'Y : X A', # свяжем две ветки наследования для проверки, обошла ли рекурсия предков Z и предков Y в поисках A
'Z : X',
'V : Z Y',
'W : V',
]

lst_q = [ # список введённых запросов
'A G', # Yes # A предок G через B/C, D, F
'A Z', # No # Y потомок A, но не Y
'A W', # Yes # A предок W через Y, V
'X W', # Yes # X предок W через Y, V
'X QWE', # No # нет такого класса QWE
'A X', # No # классы есть, но они нет родства
'X X', # Yes # родитель он же потомок
'1 1', # No # несуществующий класс
]

Не знаю где я ошибся и не знаю как исправить мой код, чтобы он работал:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
CLASSES = dict()
 
for i in range(int(input())):
    x = input()
    if ':' in x:
        b,a = x.split(':')
        a = a.replace(' ', '')
        # Если ключа А не существует то создаем новый
        if a not in CLASSES.keys():
          b = b.split()
          for item in a:
            CLASSES[item]=b
        else:
          if len(b)>1:
            b = b.split()
            for item in b:
              CLASSES[a].append(item)
          else:
            CLASSES[a].append(b)
    else:
      # A
        CLASSES[x] = [x]
def is_parent(first_class, second_class):
    if first_class not in CLASSES.keys():
      return 'No'
    elif first_class in CLASSES.keys() and second_class in CLASSES[first_class]:
        return 'Yes'
    
    for k,v in CLASSES.items():
        if second_class in v:
          if is_parent(first_class, k):
            return 'Yes'
    return 'No'
 
for t in range(int(input())):
    x = input().split()
    print(is_parent(x[0], x[1]))
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.04.2021, 10:28
Ответы с готовыми решениями:

Рекурсивный обход. Не могу сделать табуляцию. Обход с выводом имен файлов
Задание простое, ну по крайней мере на первый взгляд. Написать скрипт обхода вложенных директорий с выводом дерева (табулированного, то...

Рекурсивный обход и помещение данных в массив
Здравствуйте, может кто подскажет, есть рекрсивный обход файлов и папок с помощью iteration , подскажите пожалуйста как все данные после...

Ajax извлечение данных и обход их циклом for.of
Добрый день! Появилась проблема следующего толка, которую я попробую максимально полно описать (делаю это на основе Joomla 3!, но речь...

18
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
24.04.2021, 09:51
Напишите как вводятся данные. И вообще какое полное задание.
0
11 / 11 / 2
Регистрация: 30.03.2010
Сообщений: 199
24.04.2021, 14:52  [ТС]
eaa, Вроде все расписал...
Ввод классов:
4
A
B:A
C:A
D:B C

Далее проверка. Вводим количество запросов:

4
A B #Является ли А предком класса В. Возвращается Ответ YES
B D #Является ли В предком класса D. Возвращается Ответ YES
C D #Возвращается Ответ YES
D A #Возвращается Ответ NO
0
Костыли любой сложности
201 / 146 / 36
Регистрация: 27.10.2019
Сообщений: 843
24.04.2021, 15:10
lemuriec, https://github.com/marcosfede/... tection.py это?
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
24.04.2021, 15:37
как говорится "очень интересно, но ни### не понятно".
так что ли?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
g = {}
for _ in range(int(input())):
    s = input()
    if ':' in s:
        child, parents = s.split(':')
        parents = parents.split()
    else:
        child = parents = s
    for parent in parents:
        if parent not in g:
            g[parent] = [child]
        else:
            g[parent].append(child)
print(g)
задание напишите нормально.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
24.04.2021, 15:40
Цитата Сообщение от eaa Посмотреть сообщение
как говорится "очень интересно, но ни### не понятно".
Дак обычный dfs.
0
11 / 11 / 2
Регистрация: 30.03.2010
Сообщений: 199
26.04.2021, 10:22  [ТС]
eaa, Не думаю что задание будет понятнее))
Вот оно:

Вам дано описание наследования классов в следующем формате.
<имя класса 1> : <имя класса 2> <имя класса 3> ... <имя класса k>
Это означает, что класс 1 отнаследован от класса 2, класса 3, и т. д.

Или эквивалентно записи:

class Class1(Class2, Class3 ... ClassK):
pass
Класс A является прямым предком класса B, если B отнаследован от A:


class B(A):
pass


Класс A является предком класса B, если
A = B;
A - прямой предок B
существует такой класс C, что C - прямой предок B и A - предок C

Например:
class B(A):
pass

class C(B):
pass

# A -- предок С


Вам необходимо отвечать на запросы, является ли один класс предком другого класса

Важное примечание:
Создавать классы не требуется.
Мы просим вас промоделировать этот процесс, и понять существует ли путь от одного класса до другого.
Формат входных данных
В первой строке входных данных содержится целое число n - число классов.

В следующих n строках содержится описание наследования классов. В i-й строке указано от каких классов наследуется i-й класс. Обратите внимание, что класс может ни от кого не наследоваться. Гарантируется, что класс не наследуется сам от себя (прямо или косвенно), что класс не наследуется явно от одного класса более одного раза.

В следующей строке содержится число q - количество запросов.

В следующих q строках содержится описание запросов в формате <имя класса 1> <имя класса 2>.
Имя класса – строка, состоящая из символов латинского алфавита, длины не более 50.

Формат выходных данных
Для каждого запроса выведите в отдельной строке слово "Yes", если класс 1 является предком класса 2, и "No", если не является.

Sample Input:

4
A
B : A
C : A
D : B C
4
A B
B D
C D
D A
Sample Output:

Yes
Yes
Yes

Добавлено через 1 час 18 минут
Arsegg, что такое dfs? очень хочется понять
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
26.04.2021, 10:48
Цитата Сообщение от lemuriec Посмотреть сообщение
if first_class not in CLASSES.keys():
Избавиться от глобалки. Их вообще нельзя использовать.
То, что у вас в функции видится, как глобалка CLASSES, должно либо стать параметром classes, либо, что вероятнее, исчезнуть вообще. Потому что дерево предков класса должно получаться из самого класса. Класс знает о своих "родителях", не так ли?

Цитата Сообщение от lemuriec Посмотреть сообщение
return 'Yes'
return 'No'
Откройте для себя булевы значения, True и False. Вам тут наверняка пригодятся функции all или any.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
26.04.2021, 15:42
lemuriec, В ООП главное понимание смысла наследования. Формализация наследования классов, приучает к тупому манипулированию с классами, без понимания их содержательной сущности. Это вредное занятие, мешающее освоению ООП. Хотя такой прием может использоваться в каком либо автомате, для которого все равно чем он оперирует.

Добавлено через 3 минуты
Правильнее было бы говорить не о наследовании классов, а о дереве наследования некоторых произвольных объектов.
0
11 / 11 / 2
Регистрация: 30.03.2010
Сообщений: 199
26.04.2021, 19:04  [ТС]
Viktorrus, да ты прав. Но я изучаю питон на степике. И к сожалению задания там формируются именно так...

Добавлено через 43 секунды
Viktorrus, и я встал в тупик. как сделать так чтобы после обследования одной ветки поиск переходил на соседнюю
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
26.04.2021, 21:40
lemuriec, Если создать классы, хотя бы пустые, то с помощью средств питона можно пройтись по всему дереву наследования. Лутц описывает алгоритм, как это сделать. И по-моему дан код.

Добавлено через 34 минуты
lemuriec, Хотя у Лутца решается другая задача, чем у Вас. У Вас задается главный суперкласс и затем задаются подклассы развивая дерево сверху вниз. Лутц решает другую задачу. Как для заданного класса найти все его суперклассы в дереве наследования. Для этого используется метод
class.__bases__ -> tuple
Постепенно, шаг за шагом двигаясь вверх по дереву, можно найти все суперклассы для заданного класса.

Добавлено через 52 минуты
Вот как это работает.
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A:
    pass
class B(A):
    pass
class C(A):
    pass
class D(B, C):
    pass
 
lst_D = []
for el in D.__bases__:
    lst_D.append(el)
lst_ = lst_D[:]
for el in lst_:
    for e in el.__bases__:
        lst_D.append(e)
 
set_D = set(lst_D)
print(*set_D)             # <class '__main__.A'> <class '__main__.C'> <class '__main__.B'>
Если использовать рекурсию, то можно найти все суперклассы для конкретного класса и при больших деревьев наследования.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
26.04.2021, 21:50
Цитата Сообщение от Viktorrus Посмотреть сообщение
Для этого используется метод
class.__bases__ -> tuple
В задании явно указано, что создавать настоящие классы не нужно.

Цитата Сообщение от lemuriec Посмотреть сообщение
как сделать так чтобы после обследования одной ветки поиск переходил на соседнюю
Значит, мой ответ попал не по адресу. Бывает.
0
11 / 11 / 2
Регистрация: 30.03.2010
Сообщений: 199
27.04.2021, 09:31  [ТС]
dondublon,
Цитата Сообщение от dondublon Посмотреть сообщение
Откройте для себя булевы значения, True и False. Вам тут наверняка пригодятся функции all или any.
Что ты имеешь ввиду? Про true и false я в курсе. Просто по задаче должно возвращаться Yes или No. Или ты про что-то другое?
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
27.04.2021, 09:57
Вроде работает:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
dictionary = {}
 
for _ in range(int(input())):
    line = input()
    if ":" not in line:
        dictionary[line] = set()
    else:
        name, other = line.split(" : ")
        bases = set()
        for base in other.split():
            bases.add(base)
            if base in dictionary:
                bases.update(dictionary[base])
        dictionary[name] = bases
 
 
for _ in range(int(input())):
    parent, child = input().split()
    print("Yes" if parent in dictionary[child] else "No")
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
27.04.2021, 10:36
lemuriec, вернёте Yes-No, когда нужно будет. Но важнее то, что я написал выше. Удачи.
0
11 / 11 / 2
Регистрация: 30.03.2010
Сообщений: 199
27.04.2021, 11:49  [ТС]
другое?DmFat, Спасибо. Почти! )) один тест проходит из 16. Но. Буду плясать от твоего варианта
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
27.04.2021, 17:14
Лучший ответ Сообщение было отмечено lemuriec как решение

Решение

вроде так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def dfs(classes, start, end, path=[]):
    if not path:
        path = [start]
    if start == end:
        yield path
    for node in classes[start]:
        yield from dfs(classes, node, end, path + [node])
 
 
classes = {}
for _ in range(int(input())):
    s = input()
    if ':' in s:
        child, parents = s.split(' : ')
        parents = parents.split()
        if child not in classes:
            classes[child] = []
        for parent in parents:
            classes[child].append(parent)
            if parent not in classes:
                classes[parent] = []
    else:
        child = s
        if child not in classes:
            classes[child] = []
 
# print(*classes.items(), sep='\n')
 
for _ in range(int(input())):
    parent, child = input().split()
    if (parent in classes and child in classes) \
            and list(dfs(classes, child, parent)):
        # print(*dfs(classes, child, parent))
        print('Yes')
    else:
        print('No')
1
11 / 11 / 2
Регистрация: 30.03.2010
Сообщений: 199
27.04.2021, 19:01  [ТС]
eaa, ДА! ГЕНИЙ!!!))) теперь буду изучать что ты сделал ))
0
27.04.2021, 20:44

Не по теме:

eaa, красота!

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.04.2021, 20:44
Помогаю со студенческими работами здесь

Обход блокировки поля при вставке данных
Добрый день! Подскажите пожалуйста, можно ли в данном случае (пример прилагается) обойти блокировку полей в форме, чтобы пользователь...

Обход Acl при открытии базы данных
Извените если повторяюсь. я сделал репликацию и перенес ее на другой комп. при открытии базы данных она выдает &quot;Эта база данных...

Обход в ширину обход в глубину
помогите написать комментарии к коду def bfs_path(graph, start, end): visited = set() queue = deque(]) ...

кто поможет переделать 5 процедуру обход графа в глубину на обход графа в ширину
program kurs_work; uses crt,GraphABC; const n = 6; max = 1000; max_n = 36; var i, j, b : integer; Graf :...

Обход нескольких разных страниц и вывод данных из таблиц (скрипт отрабатывает на первой странице несколько раз)
Пишу парсер, который будет обходить несколько разных страниц и выводить данные из таблиц. Но проблема в том, что выводятся данные только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru