Dans la liste des Dicts, trouver de la valeur min () d'un champ Dict commun
-
24-10-2019 - |
Question
J'ai une liste de dictionnaires comme ceci:
[{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]
Je veux trouver le min () et prix max (). Maintenant, je peux trier ce assez facilement en utilisant une clé avec une expression lambda (que l'on trouve dans un autre article SO), donc s'il n'y a pas d'autre moyen que je ne suis pas coincé. Cependant, d'après ce que je l'ai vu il y a presque toujours une manière directe en Python, c'est donc une occasion pour moi d'apprendre un peu plus.
La solution
Il y a plusieurs options. Voici un straight-forward:
seq = [x['the_key'] for x in dict_list]
min(seq)
max(seq)
[Modifier]
Si vous ne vouliez itérer dans la liste une fois, vous pouvez essayer cela (en supposant que les valeurs pourraient être représentés comme 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)
Autres conseils
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 dit pas seulement ce que le prix maximum est mais aussi quel élément est le plus cher.
Je pense que serait quelque chose comme l'expression la plus directe (et plus Pythonic):
min_price = min(item['price'] for item in items)
On évite ainsi 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 la liste - évite effectivement la création de listes, ainsi. Efficace, direct, facile à lire ... Pythonic!
Une réponse serait la cartographie de votre dicts à la valeur d'intérêt dans une expression du générateur, puis en appliquant la Encastrements min
et max
.
myMax = max(d['price'] for d in myList)
myMin = min(d['price'] for d in myList)
peut également utiliser ceci:
from operator import itemgetter
lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]
max(map(itemgetter('price'), lst))