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.

Était-ce utile?

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 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)

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))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top