Сортировка ради одного элемента
sorted(xs)[0] упорядочивает весь список, чтобы взять одно значение.
Что не так
samyy_deshevyy = sorted(ceny)[0]
samyy_dorogoy = sorted(ceny)[-1]
Работает. Но сортировка упорядочивает весь список, а нужно одно значение.
min(ceny)
max(ceny)
Один проход вместо упорядочивания. И читается прямее: «наименьшее» вместо «отсортировать и взять первое».
С ключом
min и max принимают правило, как и sorted:
samyy_deshevyy = min(tovary, key=lambda t: t["цена"])
Здесь возвращается сам товар, а не цена. Это частая путаница:
min(ceny) даёт число, min(tovary, key=...) — объект.
Разрешение ничьей
При равенстве min и max возвращают первый встреченный. Если
порядок исходного списка случаен, случаен и ответ.
Когда ничья важна, её решают ключом:
# наибольший рейтинг, при равенстве — раньше по алфавиту
luchshiy = min(tovary, key=lambda t: (-t["рейтинг"], t["название"]))
Обратите внимание: здесь min, а не max — минус в ключе уже
перевернул порядок.
Пустой список
min([]) и max([]) выбрасывают ошибку, а не возвращают пустоту.
Проверяйте заранее или пользуйтесь доводом default:
min(ceny, default=0)
Когда сортировка всё-таки нужна
Когда нужны несколько первых. Но и тут есть готовое:
import heapq
heapq.nsmallest(3, ceny)