web-dev-qa-db-fra.com

Dans la liste des dictés, recherchez la valeur min () d'un champ Dict commun

J'ai une liste de dictionnaires comme ça:

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

Je veux trouver les prix min () et max (). Maintenant, je peux trier cela assez facilement en utilisant une clé avec une expression lambda (comme on le trouve dans un autre article SO), donc s'il n'y a pas d'autre moyen, je ne suis pas coincé. Cependant, de quoi J'ai vu qu'il y a presque toujours un moyen direct en Python, c'est donc l'occasion pour moi d'en apprendre un peu plus.

60
Hank Fay

Il existe plusieurs options. En voici un simple:

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

[Modifier]

Si vous ne souhaitez parcourir la liste qu'une seule fois, vous pouvez essayer ceci (en supposant que les valeurs peuvent être représentées par 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)
48
dappawit
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'])

Cela vous indique non seulement quel est le prix maximum, mais aussi quel article est le plus cher.

173
Hugh Bothwell

Je pense que l'expression la plus directe (et la plus pythonique) serait quelque chose comme:

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

Cela évite les frais généraux de tri de la liste - et, en utilisant une expression de générateur, au lieu d'une compréhension de liste - évite également de créer des listes. Efficace, direct, lisible ... Pythonique!

33
dcrosta

Une réponse serait de mapper vos dicts à la valeur d'intérêt à l'intérieur d'une expression de générateur, puis d'appliquer les fonctions intégrées min et max.

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

peut également utiliser ceci:

from operator import itemgetter

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