如何在字典列表中查找公共键的最小/最大值?

147

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

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

我想找到最小值(min())和最大值(max())的价格。现在,我可以使用lambda表达式中的键轻松地进行排序(就像在另一个Stack Overflow帖子中发现的那样),所以如果没有其他方法,我不会卡壳。但是,从我所看到的情况来看,Python几乎总是有一种直接的方法,因此这是一个让我学到更多的机会。

6个回答

377
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'])

这不仅告诉您最高价格是多少,还告诉您哪个物品最贵。


12
啊,这是一个不错的细节,将整个物品归还。在这种情况下不需要,但绝对是未来可以保留的好做法。 - Hank Fay
2
那就是我一直在寻找的。太棒了。谢谢! - svenwildermann
2
一个优雅的解决方案! - anapaulagomes
3
你可以先对列表进行排序,然后再选择前面的五个值。参考链接 https://dev59.com/xXVD5IYBdhLWcg3wJIAK - hibernado
4
这个很完美。根据 @thomas.mac 的评论,如果有多个最小值(例如匹配字典的列表),是否有一种简单的方法来获取 所有 这些最小值? - Romain
显示剩余3条评论

75

有几种选择。这里是一个简单直接的选择:

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

[编辑]

如果您只想遍历列表一次,您可以尝试这样做(假设值可以表示为int):

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)

1
我接受这个答案,因为它不仅给出了答案,还向我展示了如何抽象序列。啊,Python是一门美妙的语言。谢谢! - Hank Fay
2
如果您不需要seq,且列表很大,则这可能效率低下,因为必须分配整个列表的内存才能找到最大值。 - Charles L.
它会抛出 AttributeError: module 'sys' has no attribute 'maxint' - Suncatcher
3
еңЁPython 3дёӯпјҢ"@Suncatcher"жүҖжҸҗеҲ°зҡ„sys.maxintе·Із»Ҹиў«жӣҙж”№дёәsys.maxsizeгҖӮиҜ·жіЁж„ҸпјҢзҝ»иҜ‘з»“жһңдёҚеҢ…жӢ¬и§ЈйҮҠжҲ–е…¶д»–йўқеӨ–дҝЎжҒҜгҖӮ - Daniel Lavedonio de Lima

55

我认为最直接(也是最符合Python风格)的表达方式可能是:

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

这种方法避免了对列表的排序开销 - 而且,通过使用生成器表达式而不是列表推导式 - 实际上避免了创建任何列表。高效、直接、易读……符合 Python 风格!


15

其中一种解决方法是在生成器表达式中将你的字典映射为感兴趣的值,然后应用内置函数minmax

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

吹毛求疵:那些是生成器表达式。列表推导式用[]括起来,实际上会生成一个Python列表作为中间步骤。 - dcrosta
@dcrosta,是的,谢谢,你当然是正确的。我修改了措辞,因为那很尴尬。 - rlibby

5
你也可以使用这个:
from operator import itemgetter

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

0
而且为了增添这个精彩页面,这里有一个通用便捷函数的最佳答案:

def takeMaxFromDictList(listOfDicts: list, keyToLookAt: str) -> dict:
  return max( listOfDicts, key=lambda x: x[keyToLookAt] )

# -------------------------------------------------------------------

examplelist = [{'score': 0.995, 'label': 'buildings'},
               {'score': 0.002, 'label': 'mountain'},
               {'score': 0.001, 'label': 'forest'}]
 
print ( takeMaxFromDictList(examplelist, 'score') )

{'score': 0.995, 'label': 'buildings'}

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