Python使用min()函数时如何使用两个关键字

3

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

比如说,我有一个像这样的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())

我知道如何使用普通代码实现它。只是想知道是否有更符合Python风格的方法。


1
“as well as”这里是指“和(and)”,还是指最小和(min of sum)或者两者中的最小值(least of either)? - Mark
@MarkMeyer 我的意思是“和”。它应该具备最小的成本和最小的数量。 - Seaky
@MarkMeyer 但是你正在执行 int 和 int,这通常会返回1。我想也许可以像lambda d: (cost(d), count(d))这样做。 - Seaky
1个回答

2

您应该使用与排序相同的方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接