В списке Dicts найдите значение min () для общего поля Dict. - PullRequest
59 голосов
/ 16 марта 2011

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

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

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

Ответы [ 5 ]

166 голосов
/ 16 марта 2011
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'])

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

44 голосов
/ 16 марта 2011

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

seq = [x['the_key'] for x in dict_list]
min(seq)
max(seq)

[Edit]

Если вы хотите выполнить итерацию по списку только один раз, вы можете попробовать это (предполагая, что значения могут быть представлены как int с):

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)
33 голосов
/ 16 марта 2011

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

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

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

7 голосов
/ 16 марта 2011

Одним из ответов будет сопоставление ваших диктов со значением интереса внутри выражения генератора, а затем применение встроенных модулей min и max.

myMax = max(d['price'] for d in myList)
myMin = min(d['price'] for d in myList)
3 голосов
/ 30 сентября 2018

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

from operator import itemgetter

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