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.
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 int
s):
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)
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.
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!
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)
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))
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