Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
5 / 4 / 1
Регистрация: 23.05.2020
Сообщений: 22

Bookflix

23.05.2020, 12:37. Показов 3423. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Напишите рекомендательную систему для нового сервиса Bookflix, подбирающего книги для пользователя. Сервис хранит все прочитанные пользователем книги и по его запросу "Посоветуй мне книгу" должен подобрать набор книг, соответствующий критериям:

книга не должна быть прочитана пользователем ранее.

книга должна быть в любимом жанре пользователя. Любимый жанр – это жанр, который чаще всего встречается в списке прочитанных книг. Любимых жанров может быть несколько.

Формат ввода: первая строка – список всех книг сервиса, передающихся через запятую. В описание книги входит фамилия автора, название в кавычках и жанр в скобках. Каждая последующая строка описывает одно из двух действий: уведомление о прочтении книги или запрос совета. Когда пользователь прочитывает книгу, программа через пробел принимает имя пользователя и название книги. Когда пользователь просит совета, программа принимает строку "Посоветуй мне книгу" и имя пользователя в скобках. Ввод строк заканчивается точкой.

Формат вывода: после каждой просьбы совета необходимо вывести список книг через запятую, названия книг указываются в кавычках. Если нельзя рекомендовать ни одну книгу, выведите "Список пуст". Порядок книг в списке не важен.

Гарантируется, что пользователи читают только книги из списка, а также то, что названия книг разных авторов не совпадают.

Sample Input:

Булгаков "Собачье сердце" (сатира), Толкин "Властелин колец" (фэнтези), Дойл "Затерянный мир" (научная фантастика), Кристи "Десять негритят" (детектив), Кинг "Сияние" (ужасы), Дойл "Отравленный пояс" (научная фантастика), Лавкрафт "Зов Ктулху" (ужасы), Лутц "Изучаем Python" (учебная литература), Рао "C++ за 21 день" (ужасы), Толкин "Хоббит" (фэнтези), Дойл "Долина ужаса" (детектив), Кинг "Оно" (ужасы), Кристи "Убийство в доме викария" (детектив), Кинг "Противостояние" (ужасы), Вейер "Марсианин" (научная фантастика)
Dontsova "Десять негритят"
Dontsova "Долина ужаса"
Jerry "Зов Ктулху"
Maria "Хоббит"
Посоветуй мне книгу (Dontsova)
Посоветуй мне книгу (Maria)
Maria "Властелин колец"
Jerry "Противостояние"
Jerry "Затерянный мир"
Посоветуй мне книгу (Jerry)
Jerry "Отравленный пояс"
Посоветуй мне книгу (Jerry)
Посоветуй мне книгу (Maria)
.


Sample Output:

"Убийство в доме викария"
"Властелин колец"
"Сияние", "C++ за 21 день", "Оно"
"Сияние", "C++ за 21 день", "Оно", "Марсианин"
Список пуст
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
23.05.2020, 12:41
И какой вопрос? Что не получается?
0
5 / 4 / 1
Регистрация: 23.05.2020
Сообщений: 22
23.05.2020, 13:03  [ТС]
eaa, не получается запомнить по жанрам, например у 1 человека может быть несколько жанров но только если он прочитал одинаковое кол-во книг из этих жанров, если разное то должен быть жанр у которого больше книг. Например: Сначала Jerry прочитал три книги: "Зов Ктулху", "Противостояние" и "Затерянный мир". Две книги из жанра ужасов, одна книга из жанра научной фантастики. Значит, его текущий любимый жанр - ужасы. Затем он говорит "Посоветуй мне книгу". Из ужасов остались 3 книги, значит выводятся "Сияние", "C++ за 21 день", "Оно". Затем он читает книгу "Отравленный пояс". В этот момент он прочитал 2 книги из ужасов и 2 книги из фантастики. Значит, у него два любимых жанра и когда он говорит "Посоветуй мне книгу", то выведутся и оставшиеся ужасы, и оставшаяся фантастика, то есть "Сияние", "C++ за 21 день", "Оно", "Марсианин".
У меня запоминает все жанры как только прочитали хоть 1 книгу. Мой код:
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
38
39
40
41
42
43
44
book3={}
count=0
memory={}
def find_keys_by_value(d, v):
    for key, value in d.items():
        for i in value:   
            if i == v:
                keys=key  
    return keys
a=input()
a=a.replace('(','').replace(')','')
a=a.split(', ')
book={}
book2={}
lst=[]
for i in a:
    i = i.split('"')
    lst.append(i[1])
    book[i[-1][1:]]=book.get(i[-1][1:],[]) + lst
    lst=[]   
for i in iter(input, '.'):
    i=i.split()
    if i[0]!='Посоветуй':
        search=' '.join(i[1:])
        search=search[1:-1]
        lst.append(search)
        memory[i[0]]=memory.get(i[0], []) + lst
        lst=[]
        lst.append(find_keys_by_value(book, search))
        book2[i[0]]=book2.get(i[0], []) + lst
        lst=[]
        for key, value in book2.items():
            a=list(set(value))
            book3[key]=a      
    else:
        name = i[-1][1:-1]       
        for key, value in book3.items():
            if key==name:
                for i in value:
                    b=book[i]     
                    for i in b:
                        if i not in memory[key]:
                            print(i, end=' ')  
                print()
Добавлено через 5 минут
eaa, вот думаю добавить ещё одну переменную, но тогда не знаю как реализовать поиск жанра тк поиск выполняется как только ввёл строку

Добавлено через 7 минут
eaa, также не знаю как запомнить те книги которые уже прочитаны (тк их выводить не нужно)
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
23.05.2020, 13:04
Dedkrut, а "регулярки" использовать можно? или парсить стандартными функциями?
0
5 / 4 / 1
Регистрация: 23.05.2020
Сообщений: 22
23.05.2020, 15:13  [ТС]
eaa, можно

Добавлено через 2 часа 7 минут
eaa, сможете помочь?
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
23.05.2020, 15:15
Лучший ответ Сообщение было отмечено Dedkrut как решение

Решение

Начал, но нет времени доделать:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
lib_name = {}
lib_genre = {}
for book in input().split(', '):
    fio, name, genre = book.split('"')
    # fio = fio[:-1]  # а нужно ли тут вообще fio?
    # genre = genre[2:-1]  # если смысл trim и nobracket?
    name = f'"{name}"'
    lib_name[name] = genre
    lib_genre.setdefault(genre, set()).add(name)
 
reader_name = {}
reader_genre = {}
for query in iter(input, '.'):
    if query.startswith('Посоветуй мне книгу'):
        _, reader = query.split('(')
        reader = reader[:-1]  # del )
        pass
    else:
        reader, name = query.split(' ', 1)
        reader_name.setdefault(reader, set()).add(name)
        reader_genre.setdefault(reader, []).append(lib_name[name])
print(reader_name)
print(reader_genre)
1
5 / 4 / 1
Регистрация: 23.05.2020
Сообщений: 22
23.05.2020, 15:18  [ТС]
eaa, спасибо, можете сказать что нужно доделать?
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
23.05.2020, 15:24
там где pass. посмотри по коду.
0
5 / 4 / 1
Регистрация: 23.05.2020
Сообщений: 22
23.05.2020, 15:25  [ТС]
eaa, уже понял, спасибо
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
23.05.2020, 16:02
попозже выложу свой вариант, если к этому времени сам не решишь.
0
5 / 4 / 1
Регистрация: 23.05.2020
Сообщений: 22
23.05.2020, 19:34  [ТС]
eaa, извини если отвлекаю, вот дописал (знаю что у меня получилось не очень хорошо, зато оно работает, но не проходит 2-й тест)
Вот код:

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
38
39
40
41
42
43
44
45
46
from collections import Counter
 
itog=''
lib_name = {}
lib_genre = {}
book3={}
for book in input().split(', '):
    fio, name, genre = book.split('"')
    name = f'"{name}"'
    lib_name[name] = genre
    lib_genre.setdefault(genre, set()).add(name)
reader_name = {}
reader_genre = {}
for query in iter(input, '.'):
    if query.startswith('Посоветуй мне книгу'):
        _, reader = query.split('(')
        reader = reader[:-1] 
        for value in reader_genre[reader]:
            value1=0
            value2=0
            c = Counter(reader_genre[reader])
            for key in c.keys():
                if value1==0:
                    value1=c[key]
                    continue
                value2=c[key]
            if value1==value2:
                continue
            else:
                if len(reader_genre[reader])>1:
                    reader_genre[reader].pop(-1)
        set(reader_genre[reader])
        for i in reader_genre[reader]:
            for j in lib_genre[i]:
                if j not in reader_name[reader]:
                    itog+= j+', '
        itog=itog[0:-2]  
        if len(itog)>0:
            print(itog)
        else:
            print('Список пуст')
        itog=''            
    else:
        reader, name = query.split(' ', 1)
        reader_name.setdefault(reader, set()).add(name)
        reader_genre.setdefault(reader, []).append(lib_name[name])
Можешь подсказать в чём может быть ошибка.
Traceback (most recent call last):
File "jailed_code", line 18, in <module>
for value in reader_genre[reader]:
KeyError: 'Jerry'

Добавлено через 2 часа 51 минуту
eaa, всё решил, чучуть другим способом
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
d={}
name={}
for i in input().split(','):
       d[i.split('"')[-1][1:]]=d.setdefault(i.split('"')[-1][1:],[])+[''.join(i.split('"')[1:-1])]
for i in iter(input, '.'):
            if i.split()[0]!='Посоветуй':
                name[i.split()[0]]=name.setdefault(i.split()[0],set())|{' '.join(i.split()[1:])[1:-1]}
            else:
                give=i.split()[-1][1:-1]
                name[give]=name.setdefault(give,set())
                s={}
                for j in name[give]:
                    for k in d:
                        if j in d[k]:
                            s[k] = s.get(k, 0) + 1
                k=[]
                for l,v in s.items():
                    if v==max(s.values()):
                        k+=['"'+d[l][i]+'"' for i in range(len(d[l])) if d[l][i] not in name[give]]
                if len(k)>0:
                    print(*k, sep=", ")  
                else: 
                    print ('Список пуст')
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
23.05.2020, 19:42
Лучший ответ Сообщение было отмечено Dedkrut как решение

Решение

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
from collections import Counter
 
lib_name = {}
lib_genre = {}
for book in input().split(', '):
    _, name, genre = book.split('"')
    name = f'"{name}"'
    lib_name[name] = genre
    lib_genre.setdefault(genre, set()).add(name)
 
reader_name = {}
reader_genre = {}
for query in iter(input, '.'):
    if query.startswith('Посоветуй мне книгу'):
        _, reader = query.split('(')
        reader = reader[:-1]  # del )
        genres = Counter(reader_genre[reader])
        max_count = max(genres.values())
        names = set()
        for genre in [key for key, value in genres.items() if value == max_count]:
            names |= lib_genre[genre]
        res = names - reader_name[reader]
        print(*(res or ['Список пуст']), sep=', ')
    else:
        reader, name = query.split(' ', 1)
        reader_name.setdefault(reader, set()).add(name)
        reader_genre.setdefault(reader, []).append(lib_name[name])
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru