В List of Dicts найдите значение min () общего поля Dict.

У меня есть такой список словарей:

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

Я хочу найти цены min() и max(). Теперь я могу легко отсортировать это, используя ключ с лямбда-выражением (как указано в другой статье SO), поэтому, если нет другого пути, я не застрял. Однако из того, что я видел, в Python почти всегда есть прямой путь, так что это возможность для меня узнать немного больше.


person Hank Fay    schedule 16.03.2011    source источник


Ответы (5)


Есть несколько вариантов. Вот простой:

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)
person dappawit    schedule 16.03.2011
comment
Я принимаю это как ответ, поскольку он не только дает ответ, но также показал мне, что можно абстрагировать последовательности. Черт возьми, Python - прекрасный язык. Спасибо! - person Hank Fay; 16.03.2011
comment
Если вам не нужен seq, а список большой, это может быть неэффективным, поскольку память для всего списка должна выделяться только для нахождения максимального значения. - person Charles L.; 03.10.2016
comment
Выбрасывает AttributeError: module 'sys' has no attribute 'maxint' - person Suncatcher; 16.02.2019
comment
@Suncatcher в Python 3, sys.maxint изменился на sys.maxsize - person Daniel Lavedonio de Lima; 23.01.2021

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

Это говорит вам не только о максимальной цене, но и о том, какой товар самый дорогой.

person Hugh Bothwell    schedule 16.03.2011
comment
Ах, это приятно - вернуть весь предмет. Не нужен в данном случае, но определенно хранитель на будущее. - person Hank Fay; 16.03.2011
comment
вот что я искал. Потрясающие. Спасибо! - person svenwildermann-msft; 26.06.2014
comment
Элегантное решение! - person anapaulagomes; 30.11.2016
comment
Как бы вы это сделали, чтобы найти 5 самых больших элементов в списке? (не только максимум) - person thomas.mac; 10.10.2017
comment
@ thomas.mac Вы можете отсортировать, а затем выбрать 5 лучших? см. stackoverflow.com/questions/72899/ - person hibernado; 03.11.2017
comment
@ Хью Ботвелл Это волшебство! Можете ли вы помочь мне найти ресурсы, чтобы объяснить это? Спасибо! - person Kuzon; 10.04.2019
comment
Это прекрасно работает. Следуя комментарию @ thomas.mac, есть ли простой способ получить все минимумы, если их несколько (например, в виде списка совпадающих dict)? - person Romain; 05.09.2019
comment
Как бы вы удостоверились, что ['цена'] существует в слове? - person Kulu; 09.07.2021

Я думаю, что наиболее прямое (и наиболее питоническое) выражение будет примерно таким:

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

Это позволяет избежать накладных расходов на сортировку списка - и, используя выражение генератора вместо понимания списка, - также позволяет избежать создания каких-либо списков. Эффективный, прямой, читаемый ... Pythonic!

person dcrosta    schedule 16.03.2011

Один из ответов - сопоставить ваши словари с интересующим значением внутри выражения генератора, а затем применить встроенные модули min и max.

myMax = max(d['price'] for d in myList)
myMin = min(d['price'] for d in myList)
person rlibby    schedule 16.03.2011
comment
придирка: это выражения генератора. Понимание списков окружено [ и ] и фактически создает список Python в качестве промежуточного шага. - person dcrosta; 16.03.2011
comment
@dcrosta, да, спасибо, ты конечно прав. Я изменил формулировку, так как это было неудобно. - person rlibby; 16.03.2011

также можно использовать это:

from operator import itemgetter

lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]  
max(map(itemgetter('price'), lst))
person carton.swing    schedule 30.09.2018