我有以下代码。
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/