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.

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)

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.


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!


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)

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))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.