Python min () использует два ключа - PullRequest
1 голос
/ 30 октября 2019

Как я могу использовать две клавиши во встроенных функциях Python min / max?

Например, у меня есть list из dict с (они служат счетчиками) следующим образом:

[{88: 3, 68: 0, 6: 0}, {88: 2, 68: 1, 6: 0}, {88: 3, 68: 0, 6: 1}, 
 {88: 2, 68: 1, 6: 1}, {88: 3, 68: 0, 6: 2}, {88: 2, 68: 1, 6: 2}, 
 {88: 2, 68: 0, 6: 3}, {88: 2, 68: 1, 6: 0}, {88: 1, 68: 2, 6: 0}, 
 {88: 2, 68: 1, 6: 1}]

и я хочу знать, какой счетчик имеет минимальную стоимость:

cost = lambda d: sum(k * v for k, v in d.items())

, а также минимальный счет:

count = lambda d: sum(d.values())

Я знаю, каксделать это в обычном коде. Мне просто интересно, есть ли какой-нибудь питонный способ сделать это.

1 Ответ

0 голосов
/ 30 октября 2019

Вы должны использовать тот же метод, который вы использовали бы для sort ing :

>>> my_list = [{88: 3, 68: 0, 6: 0}, {88: 2, 68: 1, 6: 0}, {88: 3, 68: 0, 6: 1},
               {88: 2, 68: 1, 6: 1}, {88: 3, 68: 0, 6: 2}, {88: 2, 68: 1, 6: 2},
               {88: 2, 68: 0, 6: 3}, {88: 2, 68: 1, 6: 0}, {88: 1, 68: 2, 6: 0},
               {88: 2, 68: 1, 6: 1}]

>>> sorted(my_list, key=lambda d: (sum(k * v for k, v in d.items()), sum(d.values())))
[{88: 2, 68: 0, 6: 3}, {88: 1, 68: 2, 6: 0}, {88: 2, 68: 1, 6: 0}, {88: 2, 68: 1, 6: 0}, 
 {88: 2, 68: 1, 6: 1}, {88: 2, 68: 1, 6: 1}, {88: 2, 68: 1, 6: 2}, {88: 3, 68: 0, 6: 0},
 {88: 3, 68: 0, 6: 1}, {88: 3, 68: 0, 6: 2}]

>>> min(my_list, key=lambda d: (sum(k * v for k, v in d.items()), sum(d.values())))
{88: 2, 68: 0, 6: 3}

>>> max(my_list, key=lambda d: (sum(k * v for k, v in d.items()), sum(d.values())))
{88: 3, 68: 0, 6: 2}
...