En Lista de dictados, busque el valor min () de un campo de dictado común

91

Tengo una lista de diccionarios como este:

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

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

Hank Fay
fuente

Respuestas:

60

Hay varias opciones. Aquí hay uno sencillo:

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

[Editar]

Si solo desea recorrer la lista una vez, puede intentar esto (asumiendo 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)
dappawit
fuente
Acepto esto como la respuesta, ya que no solo da la respuesta, sino que también me mostró que se pueden abstraer secuencias. Maldita sea, Python es un lenguaje hermoso. ¡Gracias!
Hank Fay
2
Si no necesita el seq, y la lista es grande, esto puede ser ineficiente ya que la memoria para toda la lista debe asignarse solo para encontrar el máximo.
Charles L.
Se lanzaAttributeError: 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'])

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

Hugh Bothwell
fuente
4
Ah, es un buen toque, devolver todo el artículo. No es necesario en este caso, pero definitivamente un guardián para el futuro.
Hank Fay
eso es lo que estaba buscando. Increíble. ¡Gracias!
svenwildermann
¡Una solución elegante!
anapaulagomes
2
@ thomas.mac ¿Podrías ordenar y luego seleccionar los 5 primeros? ver stackoverflow.com/questions/72899/…
hibernado
2
Esto funciona perfectamente. Siguiendo el comentario de @ thomas.mac, ¿hay una manera fácil de obtener todos los mínimos si hay varios (como una lista de dict coincidentes, por ejemplo)?
Romain
40

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

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

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

dcrosta
fuente
8

Una respuesta sería mapear sus dictados con el valor de interés dentro de una expresión generadora y luego aplicar los elementos integrados miny max.

myMax = max(d['price'] for d in myList)
myMin = min(d['price'] for d in myList)
rlibby
fuente
nitpick: esas son expresiones generadoras. Las listas por comprensión están rodeadas por [y ], y en realidad generan una lista de Python como paso intermedio.
dcrosta
@dcrosta, sí, gracias, por supuesto que tienes razón. Cambié la redacción ya que era vergonzoso.
rlibby
3

también puede usar esto:

from operator import itemgetter

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