En Lista de Dictos, encuentra el valor min () de un campo de Dictos común


Tengo una lista de diccionarios, así:

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

Quiero encontrar los precios min() y max (). Ahora, puedo ordenar esto fácilmente usando una clave con una expresión lambda (como se encuentra en otro artículo SO), por lo que si no hay otra manera no estoy atascado. Sin embargo, por lo que he visto, casi siempre hay una forma directa en Python, por lo que esta es una oportunidad para mí de aprender un poco más.

Author: vaultah, 2011-03-16

5 answers

Hay varias opciones. He aquí una sencilla:

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

[Editar]

Si solo desea recorrer la lista una vez, puede probar esto (suponiendo que los valores se representen como 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)
 37
Author: dappawit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 04:12:20
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'])

Esto le dice no solo cuál es el precio máximo, sino también qué artículo es más caro.

 125
Author: Hugh Bothwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 14:20:56

Creo que la expresión más directa (y más pitónica) sería algo así como:

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

Esto evita la sobrecarga de ordenar la lista -- y, mediante el uso de una expresión generadora, en lugar de una comprensión de lista actually en realidad evita la creación de listas, también. Eficiente, directo, legible... ¡Pythonic!

 27
Author: dcrosta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 04:00:59

Una respuesta sería asignar sus dictados al valor de interés dentro de una expresión generadora, y luego aplicar los elementos incorporados min y max.

myMax = max(d['price'] for d in myList)
myMin = min(d['price'] for d in myList)
 6
Author: rlibby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 04:11:18

También puede usar esto:

from operator import itemgetter

lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]  
max(map(itemgetter('price'), lst))
 0
Author: carton.swing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-30 06:23:48