在Dicts列表中,找到常见Dict字段的min()值

Han*_*Fay 68 python dictionary list max min

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

[{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]
Run Code Online (Sandbox Code Playgroud)

我想找到min()和max()价格.现在,我可以使用带有lambda表达式的键(在另一篇SO文章中找到)轻松地对此进行排序,所以如果没有其他方法我就不会卡住.然而,从我所看到的,几乎总是在Python中有一个直接的方式,所以这是我学习更多东西的机会.

Hug*_*ell 185

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'])
Run Code Online (Sandbox Code Playgroud)

这不仅告诉您最高价格是什么,还告诉您哪个项目最贵.

  • 啊,这是一个很好的触摸,返回整个项目.在这种情况下不需要,但非常肯定是未来的守护者. (4认同)
  • 这非常有效。按照@thomas.mac的评论,如果有几个(例如,作为匹配字典的列表),是否有一种简单的方法来获取*所有*最小值? (4认同)
  • @thomas.mac 您可以排序然后选择前 5 个吗?见 /sf/ask/5102961/ (3认同)

dap*_*wit 50

有几种选择.这是一个直截了当的:

seq = [x['the_key'] for x in dict_list]
min(seq)
max(seq)
Run Code Online (Sandbox Code Playgroud)

[编辑]

如果你只想迭代一次列表,你可以尝试这个(假设值可以表示为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)
Run Code Online (Sandbox Code Playgroud)

  • @Suncatcher 在 Python 3 中,“sys.maxint”已更改为“sys.maxsize” (3认同)
  • 如果你不需要`seq`,并且列表很大,这可能是低效的,因为必须分配整个列表的内存才能找到最大值. (2认同)

dcr*_*sta 36

我认为最直接(也是最Pythonic)的表达方式如下:

min_price = min(item['price'] for item in items)
Run Code Online (Sandbox Code Playgroud)

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


rli*_*bby 7

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

myMax = max(d['price'] for d in myList)
myMin = min(d['price'] for d in myList)
Run Code Online (Sandbox Code Playgroud)


car*_*ing 5

也可以使用这个:

from operator import itemgetter

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