首页 > 解决方案 > Python min() 使用两个键

问题描述

如何在 Python 内置min/max函数中使用两个键?

例如,我有一个listof dicts(它们用作计数器),如下所示:

[{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())

我知道如何在普通代码中做到这一点。我只是想知道是否有任何pythonic方法可以做到这一点。

标签: pythonmin

解决方案


您应该使用与sorting完全相同的方法:

>>> 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}

推荐阅读