Pregunta

Tengo una lista de diccionarios como así:

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

Quiero encontrar los precios min () y max (). Ahora, puedo ordenar esto con la suficiente facilidad usando una llave con una expresión de lambda (como se encuentra en otro artículo), por lo que si no hay otra forma en que 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 que aprenda un poco más.

¿Fue útil?

Solución

Hay varias opciones. Aquí hay uno directo:

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

Editar

Si solo quisiera iterar a través de la lista una vez, podría intentarlo (suponiendo que los valores podrían representarse 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)

Otros consejos

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 el más caro.

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

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

Esto evita la sobrecarga de clasificar la lista, y, mediante el uso de una expresión de generador, en lugar de una comprensión de la lista, en realidad evita la creación de cualquier lista también. Eficiente, directo, legible ... Pythonic!

Una respuesta sería mapear sus dicts al valor de interés dentro de una expresión de generador, y luego aplicar los empotrados min y max.

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

También puede usar esto:

from operator import itemgetter

lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]  
max(map(itemgetter('price'), lst))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top