【问题标题】:How to find the min/max value of a common key in a list of dicts?如何在字典列表中找到公共键的最小/最大值?
【发布时间】:2011-07-16 07:20:50
【问题描述】:

我有一个这样的字典列表:

[{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]

我想查找min()max() 的价格。现在,我可以使用带有 lambda 表达式的键(在另一个 Stack Overflow 帖子中找到)很容易地对它进行排序,所以如果没有其他方法,我不会卡住。但是,据我所见,Python 中几乎总是有直接的方法,所以这是我学习更多知识的机会。

【问题讨论】:

    标签: python list dictionary max min


    【解决方案1】:
    lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]
    
    maxPricedItem = max(lst, key=lambda x:x['price'])
    minPricedItem = min(lst, key=lambda x:x['price'])
    

    这不仅可以告诉您最高价格是多少,还可以告诉您最贵的商品。

    【讨论】:

    • 啊,这是一个很好的接触,返回整个项目。在这种情况下不需要,但绝对是未来的守护者。
    • 这就是我想要的。惊人的。谢谢!
    • 一个优雅的解决方案!
    • @thomas.mac 您可以排序然后选择前 5 个吗?见stackoverflow.com/questions/72899/…
    • 这非常有效。在@thomas.mac 的评论之后,如果有多个(例如,作为匹配字典的列表),是否有一种简单的方法来获取 all 最小值?
    【解决方案2】:

    有多种选择。这是一个直截了当的:

    seq = [x['the_key'] for x in dict_list]
    min(seq)
    max(seq)
    

    [编辑]

    如果你只想遍历列表一次,你可以试试这个(假设值可以表示为ints):

    import sys
    
    lo,hi = sys.maxint,-sys.maxint-1
    for x in (item['the_key'] for item in dict_list):
        lo,hi = min(x,lo),max(x,hi)
    

    【讨论】:

    • 我接受这个作为答案,因为它不仅给出了答案,而且还告诉我可以抽象序列。该死,Python 是一门美丽的语言。谢谢!
    • 如果你不需要seq,并且列表很大,这可能是低效的,因为必须分配整个列表的内存才能找到最大值。
    • 它抛出AttributeError: module 'sys' has no attribute 'maxint'
    • @Suncatcher 在 Python 3 中,sys.maxint 已更改为 sys.maxsize
    【解决方案3】:

    我认为最直接(也是最 Pythonic)的表达式是这样的:

    min_price = min(item['price'] for item in items)
    

    这避免了对列表进行排序的开销——并且,通过使用生成器表达式而不是列表推导——实际上也避免了创建任何列表。高效、直接、可读... Pythonic!

    【讨论】:

      【解决方案4】:

      一个答案是将您的 dicts 映射到生成器表达式中感兴趣的值,然后应用内置函数 minmax

      myMax = max(d['price'] for d in myList)
      myMin = min(d['price'] for d in myList)
      

      【讨论】:

      • nitpick:这些是生成器表达式。列表推导被 [] 包围,实际上生成一个 Python 列表作为中间步骤。
      • @dcrosta,是的,谢谢,你当然是对的。我改变了措辞,因为那很尴尬。
      【解决方案5】:

      也可以这样用:

      from operator import itemgetter
      
      lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]  
      max(map(itemgetter('price'), lst))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 2015-08-05
        • 2015-04-22
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        相关资源
        最近更新 更多