我有以下代码。

sum_review = reduce(add,[book['rw'] for book in books])
sum_rating = reduce(add,[book['rg'] for book in books])
items = len(books)
avg_review = sum_review/items
avg_rating = sum_rating/items

我想要的是这个。
sum_review,sum_rating = reduce(add,([book['rw'],[book['rg']) for book in books])
items = len(books)
avg_review = sum_review/items
avg_rating = sum_rating/items

显然这行不通。在没有常规循环的情况下,如何解决这种冗余?

最佳答案

有两种典型的简化代码的方法:

  • 自上而下:先获取值,然后用 zip(*iterable) 转置它们。这也很酷,因为它只迭代一次集合:
    values = ((book["rw"], book["rg"]) for book in books)
    avg_review, avg_rating = [sum(xs) / len(books) for xs in zip(*values)]
    
  • 自下而上:创建一个函数来抽象操作:
    get_avg = lambda xs, attr: sum(x[attr] for x in xs) / len(xs)
    avg_review = get_avg(books, "rw")
    avg_rating = get_avg(books, "rg")
    
  • 关于python - 我可以基于两个值将列表理解简化为两个列表吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4539704/

    10-14 14:03