如何在字典列表中找到公共键的最小/最大值?
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)
[编辑]
如果你只想遍历列表一次,你可以试试这个(假设值可以表示为int
s):
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 映射到生成器表达式中感兴趣的值,然后应用内置函数 min
和 max
。
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文件派生的大量字典中的值列表中查找最小值和最大值