Фильтрующий массив Python с использованием функции any () - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь написать программу, которая рекомендует книги, используя два ввода:

  • Максимальная сумма денег, которую клиент готов потратить.
  • Строка, состоящая из первых букв всех желаемых атрибутов («ужас», «фантастика», «романтика», «фантазия»).

Требуемым входным атрибутом должна быть строка типа sh или shf (порядок не должен иметь значения, поэтому строка "shf" обрабатывается так же, как и "fhs").

Я успешно создал фильтр, который отфильтровывает книги, которые превышают максимальную стоимость клиента. Однако функция продолжает выводить любые книги, которые входят в любой категорий, предоставленных пользователем, а не книги, которые соответствуют всем категориям , как требуется (например, книги, которые оба находятся вфантазия и романтика, например). Я пытался заменить функцию any() на функцию all(), но, похоже, это не устраняет проблему. Кто-нибудь может дать предложения о том, где я иду не так?

def recommend_books(max_price, cats):
    if not set(cats).issubset(set(book_categories)):
        raise ValueError(f'{cats} contains an invalid category code')
    cats_f = [cat for cat_i, cat in book_categories.items() if cat_i in set(cats)]
    return [book for book, price, cats in book_data
            if (price <= max_price and all(True for cat in cats if cat in cats_f))]


book_data = [["Harry Potter", 8, ["fantasy", "romance"]],
             ["IT", 11, ["horror", "fantasy"]],
             ["Star Wars", 22, ["scifi", "romance", "fantasy"]],
             ["Carrie", 13, ["horror"]],
             ["Lord of the Rings", 29, ["fantasy", "romance"]]
             ]

book = [book[0] for book in book_data]

book_categories = {}
for book, price, category in book_data:
    for cat in category:
        cat_initial = cat[0]
        if not cat_initial in book_categories:
            book_categories[cat_initial] = cat

recommend_books(25, "hf")
# Output should be an array of the Titles of the suitable book recommendations
# I.e. ["IT"]

Выходные данные для этого примера: ['Harry Potter', 'IT', 'Star Wars', 'Carrie'], который представляет собой массив всех книг ужасов и фэнтези менее 25, так чтофильтр работает неправильно.

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

Редактирование моего ответа после вашего комментария:

ваше второе условие при фильтрации должно быть:

all(elem in cats for elem in cats_f)

и полная функция:

def recommend_books(max_price, cats):
        if not set(cats).issubset(set(book_categories)):
            raise ValueError(f'{cats} contains an invalid category code')
        cats_f = [cat for cat_i, cat in book_categories.items() if cat_i in set(cats)]
        return [book for book, price, cats in book_data 
                if (price <= max_price and **all (True for cat in cats if cat in cats_f))**]

итерация повсе категории (cat_f), которые вы хотите иметь, и проверьте, все ли они входят в категории книги (cats)

, это даст желаемый результат.

0 голосов
/ 09 ноября 2019

Это должно сделать это:

def recommend_books(max_price, cats):
    if not set(cats).issubset(set(book_categories)):
        raise ValueError(f'{cats} contains an invalid category code')
    cats_f = [cat for cat_i, cat in book_categories.items() if cat_i in set(cats)]
    return [book for book, price, cats in book_data
            if (price <= max_price and all (cat in cats for cat in cats_f))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...