У списку диктовок знайдіть значення min () загального поля Dict


91

У мене є список таких словників:

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

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

Відповіді:


60

Є кілька варіантів. Ось прямий:

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 - прекрасна мова. Дякую!
Хенк Фей,

2
Якщо вам не потрібен seq, а список великий, це може бути неефективним, оскільки пам'ять для всього списку повинна бути виділена лише для пошуку макс.
Чарльз Л.

Він кидаєAttributeError: module 'sys' has no attribute 'maxint'
Suncatcher

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

Це говорить вам не лише про максимальну ціну, а й про те, який товар є найдорожчим.


4
Ах, це приємний штрих, повертаючи весь предмет. В даному випадку це не потрібно, але цілком надійно зберігач на майбутнє.
Хенк Фей,

це те, що я шукав. Приголомшливо Дякую!
svenwildermann

Елегантне рішення!
anapaulagomes

2
@ thomas.mac Ви можете відсортувати, а потім вибрати топ-5? см stackoverflow.com/questions/72899 / ...
hibernado

2
Це працює чудово. Після коментаря @ thomas.mac, чи є простий спосіб отримати всі мінімуми, якщо їх декілька (наприклад, як список відповідних диктів)?
Ромен

40

Я думаю, що найпрямішим (і найбільш пітонічним) виразом буде щось на зразок:

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

Це дозволяє уникнути накладних витрат на сортування списку - і, використовуючи вираз генератора, замість розуміння списку - насправді також уникає створення будь-яких списків. Ефективний, прямий, читабельний ... Пітонічний!


8

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

myMax = max(d['price'] for d in myList)
myMin = min(d['price'] for d in myList)

nitpick: це вирази генератора. Розуміння списку оточується [і ], і насправді генерує список Python як проміжний крок.
dcrosta

@dcrosta, так, дякую, ти, звичайно, маєш рацію. Я змінив формулювання, оскільки це було ніяково.
rlibby

3

також можна використовувати це:

from operator import itemgetter

lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]  
max(map(itemgetter('price'), lst))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.