У меня есть список «продуктов», где у каждого есть две функции, например: цена и рейтинг для книг, или время и цена билетов и т. Д.
Книги (10, 15), где 10 это цена в долларах (дешевле лучше), а 15 - рейтинг от 0 до 100 (лучше - лучше).Сортировка по лучшим комбинациям из двух
L = [(150, 100), (50, 15), (20, 70), (10, 40), (76, 30)]
Список следует сортировать по лучшей цене.
У меня есть 2 решения до сих пор, лучше всего найти «вес» для каждой пары, умножив price*(1/rating)
и отсортировав по этому «весу», тем лучше.
res1 = {}
for i in L:
res1[i] = i[0]*(1./i[1])
# {(10, 40): 0.25, (20, 70): 0.2857, (50, 15): 3.3333, (76, 30): 2.5333, (150, 100): 1.5}
sorted(res1, key=lambda x: res1[x])
# [(10, 40), (20, 70), (150, 100), (76, 30), (50, 15)]
Второе решение является более сложным и менее представительным. Для этого нужно сортировать два раза - по цене и по рейтингу (рейтинг - вспять) и пытаться найти матчи. «Вес» будет индексом в первом отсортированном списке, умноженным (или суммированным) на индекс во втором отсортированном списке.
L1 = sorted(L, key=lambda x: x[0])
L2 = sorted(L, key=lambda x: x[1], reverse=True)
res = {}
for i in L:
res[i] = (L1.index(i)+1) * (L2.index(i)+1)
res
# {(10, 40): 3, (20, 70): 4, (50, 15): 15, (76, 30): 16, (150, 100): 5}
sorted(res, key=lambda x: res[x])
# [(10, 40), (20, 70), (150, 100), (50, 15), (76, 30)]
При использовании второго варианта с большим количеством данных он показывает менее репрезентативные результаты.
Но я устал изобретать колесо, поэтому какие математические и алгоритмические решения вы можете предложить? Интересно, если у этого вопроса есть решение, когда есть 3 и более функций: цена, время доставки, вес, рейтинг и т. Д.
Обновление: Благодаря @georgesl для указания этого. Как я мог справиться с выбросами, например очень плохой книгой, но это очень дешево? Я думаю, что к ним нужно относиться как-то иначе.
Я думаю, что первый из них уже хорош. Почему именно вам нужен новый алгоритм? – aIKid
первого метода вполне достаточно. Однако вам нужно иметь дело с выбросами: например. книги, которые являются полным дерьмом, но действительно дешевым (поэтому с высоким соотношением цены за единицу стоимости) и книгами настолько хороши, что редакторы могут позволить себе поставить на него высокую цену. – lucasg
Это не та же «цена» (1/оценка) '=' цена/рейтинг'? – itdxer