在Dicts列表中,找到一个公共Dict字段的min()值


90

我有这样的词典列表:

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

我想找到min()和max()价格。现在,我可以使用带有lambda表达式的键(在另一篇SO文章中找到)轻松地对它进行排序,因此,如果没有其他方法,我就不会陷入困境。但是,据我所见,Python中几乎总是有直接方法,因此这是我学习更多知识的机会。

Answers:


60

有几种选择。这是简单明了的一个:

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是一门美丽的语言。谢谢!
汉克·菲

2
如果您不需要seq,并且列表很大,这可能会导致效率低下,因为必须分配整个列表的内存才能找到最大值。
Charles L.

引发AttributeError: module 'sys' has no attribute 'maxint'
Suncatcher

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

这不仅告诉您最高价格是多少,还告诉您哪个项目最昂贵。


4
嗯,这很不错,可以退还整个物品。在这种情况下不需要,但绝对是将来的守护者。
汉克·菲

那就是我想要的。太棒了 谢谢!
svenwildermann 2014年

优雅的解决方案!
anapaulagomes,2016年

2
@ thomas.mac您可以排序,然后选择前5名?参见stackoverflow.com/questions/72899/…–
hibernado

2
这很完美。在@ thomas.mac的注释之后,如果有多个最小值(例如,作为匹配字典的列表),有没有一种简单的方法来获取所有最小值?
罗曼(Romain)

40

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

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

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


8

一种答案是将您的字典映射到生成器表达式内的兴趣值,然后应用内置的minmax

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

nitpick:这些是生成器表达式。列表解析由[和包围],并且实际上生成一个Python列表作为中间步骤。
dcrosta 2011年

@dcrosta,是的,谢谢,您当然是对的。我改变了措辞,因为这很尴尬。
rlibby 2011年

3

也可以这样使用:

from operator import itemgetter

lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]  
max(map(itemgetter('price'), lst))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.