【发布时间】:2019-11-09 14:35:45
【问题描述】:
我正在尝试编写一个通过两个输入来推荐书籍的程序:
- 客户准备花费的最大金额。
- 由所有所需属性(“horror”、“scifi”、“romance”、“fantasy”)的首字母组成的字符串。
所需的属性输入应该是一个字符串,例如 sh 或 shf(顺序不重要,因此字符串“shf”被视为与“fhs”相同)。
我已经成功创建了一个过滤器,可以过滤掉超出客户最大成本的图书。但是,该函数会继续输出属于用户提供的任何类别的任何书籍,而不是按要求满足所有类别的书籍(例如例如,在幻想和浪漫中)。我试图用all() 函数替换any() 函数,但这似乎并不能解决问题。谁能提供关于我哪里出错的建议?
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 的恐怖和奇幻书籍的数组,因此过滤器似乎没有工作正常。
【问题讨论】: