python 的 max/min 函数可以有多个 key/lambda 吗?

Is it possible to have more than one key/lambda for python's max/min functions?

以下代码已损坏:

>>> import operator
>>> max(enumerate([[7, {'profit': 7, 'buy_idx': 0, 'sell_idx': 1}], [0, {'profit': 0, 'buy_idx': None, 'sell_idx': None}], [7, {'profit': 7, 'buy_idx': 0, 'sell_idx': 2}]]), key=operator.itemgetter(1))
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    max(enumerate([[7, {'profit': 7, 'buy_idx': 0, 'sell_idx': 1}], [0, {'profit': 0, 'buy_idx': None, 'sell_idx': None}], [7, {'profit': 7, 'buy_idx': 0, 'sell_idx': 2}]]), key=operator.itemgetter(1))
TypeError: '>' not supported between instances of 'dict' and 'dict'

我不完全确定问题出在哪里,但我相当确定这是因为 max 正在评估字典并尝试比较它们,即使它们不是列表的第一个元素.

我知道如果我可以使用 key=lambda x: x[0] 那么只会比较每个列表的第一个元素(整数),这将解决我的问题。

>>> max([[7, {'profit': 7, 'buy_idx': 0, 'sell_idx': 1}], [0, {'profit': 0, 'buy_idx': None, 'sell_idx': None}], [7, {'profit': 7, 'buy_idx': 0, 'sell_idx': 2}]], key=lambda x: x[0])
[7, {'profit': 7, 'buy_idx': 0, 'sell_idx': 1}]

但是,我已经通过 operator.itemgetter 使用了密钥,这并不是真正可以协商的,因为我需要同时获取最大元素索引。

所以我处于困境,我需要将两个 lambda 传递给 python 的关键参数。

这可能吗?如果没有,我最好的解决方案是什么?

查找具有最大 profit 的字典并且索引在不复制 profit 值作为 list 中的第一个元素的情况下工作.我稍微修改了字典。

d = [{'profit': 3, 'buy_idx': 0, 'sell_idx': 1},
     {'profit': 0, 'buy_idx': None, 'sell_idx': None},
     {'profit': 7, 'buy_idx': 0, 'sell_idx': 2}]

index, maxdict = max(enumerate(d), key=lambda x: x[1]['profit'])
print(f'max profit in {maxdict} at index {index}')

输出

max profit in {'profit': 7, 'buy_idx': 0, 'sell_idx': 2} at index 2