Вот простой пример использования «псевдообзоров» (как описано в https://stats.stackexchange.com/questions/173683/sorting-products-by-reviews-considering-the-number-of-reviews) для сортировки списка:
from statistics import mean
from typing import List, NamedTuple
class Book(NamedTuple):
title: str
reviews: List[int]
# other useful info might go here?
books = [
Book("The Big Orange Splot", [5, 5]),
Book("Lizard Music", [5, 5, 5, 5, 4, 5]),
Book("Young Adult Novel", [2, 2, 5, 5, 5, 5, 5, 5]),
Book("Fishwhistle", [4, 4, 5, 4, 5]),
Book("The Davinci Code", [2, 2, 5, 2, 3, 4, 2, 1])
]
books.sort(
key=lambda book: mean(book.reviews + [3, 3, 3]),
reverse=True
)
for book in books:
print(
f"{book.title}: "
f"{mean(book.reviews):.1f} stars "
f"({len(book.reviews)} reviews)"
)
Lizard Music: 4.8 stars (6 reviews)
Young Adult Novel: 4.2 stars (8 reviews)
Fishwhistle: 4.4 stars (5 reviews)
The Big Orange Splot: 5.0 stars (2 reviews)
The Davinci Code: 2.6 stars (8 reviews)
Обратите внимание, что sort()
call добавляет 3 поддельных 3-звездочных отзыва перед тем, как позвонить mean()
с целью перекосить книги с небольшим количеством отзывов к 3, но позже, когда мы отображаем отзывы, мы используем «реальный» средний рейтинг без поддельных записей.