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

Posted

技术标签:

【中文标题】如何在字典列表中找到公共键的最小/最大值?【英文标题】: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 中几乎总是有直接的方法,所以这是我学习更多知识的机会。

【问题讨论】:

【参考方案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 个吗?见***.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))

【讨论】:

以上是关于如何在字典列表中找到公共键的最小/最大值?的主要内容,如果未能解决你的问题,请参考以下文章

如何从从excel文件派生的大量字典中的值列表中查找最小值和最大值

[基础] 在Python中获得字典列表中最大值与最小值

保留键的情况下取字典中最大的值(maxzip函数的联合使用)

Python基础之公共方法

如何从Dart中的列表中找到最小值和最大值?

在python中找到二维矩阵(二维)中不同列表的最小值、最大值和平均值