【问题标题】:Python filtering array using the any() function使用 any() 函数的 Python 过滤数组
【发布时间】: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 的恐怖和奇幻书籍的数组,因此过滤器似乎没有工作正常。

【问题讨论】:

    标签: python arrays any


    【解决方案1】:

    在您发表评论后编辑我的答案:

    您在过滤中的第二个条件应该是:

    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

    这会产生您想要的输出。

    【讨论】:

    • 对不起,这可能是我措辞的方式。 print(recommend_books(25, "hf")) 应该返回成本小于或等于 25 的恐怖和奇幻书籍,因此它应该返回:['IT']。但是,该函数会返回所有小于 25 的恐怖和奇幻书籍,因此过滤器似乎无法正常工作。
    【解决方案2】:

    应该这样做:

    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))]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 2017-05-14
      • 2023-03-20
      • 2016-01-26
      相关资源
      最近更新 更多