如何根据 Python 中的不同键从字典列表中找到最大值

How to find the max value from a list of dicts based on different keys in Python

我有下面的听写列表

[{
    'NAV': 50,
    'id': '61e6b2a1d0c32b744d3e3b2d'
}, {
    'NAV': 25,
    'id': '61e7fbe2d0c32b744d3e6ab4'
}, {
    'NAV': 30,
    'id': '61e801cbd0c32b744d3e7003'
}, {
    'NAV': 30,
    'id': '61e80663d0c32b744d3e7c51'
}, {
    'NAV': 30,
    'id': '61e80d9ad0c32b744d3e8da6'
}, {
    'NAV': 30,
    'id': '61e80f5fd0c32b744d3e93f0'
}, {
    'NAV': 30,
    'id': '61e90908d0c32b744d3ea967'
}, {
    'NAV': 30,
    'id': '61ea7cf3d0c32b744d3ed1b2'
}, {
    'NAV': 50,
    'id': '61fa387127e14670f3a67194'
}, {
    'NAV': 30,
    'id': '61fa3cea27e14670f3a6772c'
}, {
    'Amount': 30,
    'id': '61e6b373d0c32b744d3e3d14'
}, {
    'Amount': 30,
    'id': '61e6b49cd0c32b744d3e3ea0'
}, {
    'Amount': 25,
    'id': '61e7fe90d0c32b744d3e6ccd'
}, {
    'Amount': 20,
    'id': '61e80246d0c32b744d3e7242'
}, {
    'Amount': 20,
    'id': '61e80287d0c32b744d3e74ae'
}, {
    'Amount': 20,
    'id': '61e80253d0c32b744d3e733e'
}, {
    'Amount': 34,
    'id': '61e80697d0c32b744d3e7edd'
}, {
    'Amount': 20,
    'id': '61e806a3d0c32b744d3e7ff9'
}, {
    'Amount': 30,
    'id': '61e80e0ad0c32b744d3e906e'
}, {
    'Amount': 30,
    'id': '61e80e22d0c32b744d3e9198'
}, {
    'Amount': 20,
    'id': '61e81011d0c32b744d3e978e'
}, {
    'Amount': 20,
    'id': '61e8104bd0c32b744d3e9a92'
}, {
    'Amount': 20,
    'id': '61e81024d0c32b744d3e98cd'
}, {
    'Amount': 20,
    'id': '61e90994d0c32b744d3eac2b'
}, {
    'Amount': 20,
    'id': '61e909aad0c32b744d3ead76'
}, {
    'Amount': 50,
    'id': '61fa392a27e14670f3a67337'
}, {
    'Amount': 50,
    'id': '61fa393727e14670f3a67347'
}, {
    'Amount': 50,
    'id': '61fa3d6727e14670f3a67750'
}, {
    'Amount': 150,
    'id': '61fa3d7127e14670f3a67760'
}]

上面的列表包含 dict,其键为 NAVAmount。我需要在 NAV 和 Amount 的所有字典中分别找到最大值。所以输出是

NAV = 50
Amount = 150

我尝试了一些方法,例如:

max(outList, key=lambda x: x['NAV'])

但这给了我 'NAV' 的键盘错误。最好的方法是什么?

你可以尝试这样的事情:

print max([i["NAV"] for i in t if "NAV" in i])
print max([i["Amount"] for i in t if "Amount" in i])

结果:

50
150
def max_from_list(t_list, key):
    return max([i[key] for i in t_list if key in i])

我不明白你为什么打电话给 Current NAV ($ M)。它不存在于您提供的列表中。不管怎样,我想出了下面的代码:

def getMax(value):
  if "NAV" in value:
    return value["NAV"]
  else:
    return value["Amount"]
  
max(outList, key= getMax)

如果您有兴趣分别找到 NAVAmount 的最大值,您可以尝试过滤掉列表,然后像之前一样调用 lambda。

print(max([x["NAV"] for x in outList if "NAV" in x]))
print(max([x["Amount"] for x in outList if "Amount" in x]) 

您的 max 解决方案是正确的:

假设您的列表名为 outList(顺便说一句,这不是 pythonic 名称,请尝试使用 out_list

nav = max(outList, key=lambda item: item.get("NAV", float("-inf")))['NAV']
amount = max(outList, key=lambda item: item.get("Amount", float("-inf")))['Amount']

如果你不只是寻找资产净值和金额,也许你可以这样做:

from collections import defaultdict
res = defaultdict(list)

for i in d:
    for k, v in i.items():
        if k != 'id':
            res[k] = max(res.get(k, 0), v)