Finden Sie in der Liste der Diktate min () Wert eines gemeinsamen Diktierfelds
-
24-10-2019 - |
Frage
Ich habe eine Liste von Wörterbüchern wie SO:
[{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]
Ich möchte die Preise für min () und max () finden. Jetzt kann ich dies leicht genug mit einem Schlüssel mit einem Lambda -Ausdruck sortieren (wie in einem anderen Artikel gefunden). Wenn es also keinen anderen Weg gibt, stecke ich nicht fest. Nach dem, was ich gesehen habe, gibt es in Python jedoch fast immer einen direkten Weg, also ist dies eine Gelegenheit für mich, ein bisschen mehr zu lernen.
Lösung
Es gibt mehrere Optionen. Hier ist ein direkter:
seq = [x['the_key'] for x in dict_list]
min(seq)
max(seq)
Bearbeiten
Wenn Sie nur einmal durch die Liste iterieren wollten, können Sie dies versuchen (vorausgesetzt, die Werte könnten als 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)
Andere Tipps
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'])
Dies sagt Ihnen nicht nur, was der maximale Preis ist, sondern auch welcher Artikel am teuersten ist.
Ich denke, der direkteste (und pythonischste) Ausdruck wäre so etwas wie:
min_price = min(item['price'] for item in items)
Dies vermeidet den Overhead, die Liste zu sortieren - und durch Verwendung eines Generatorausdrucks anstelle eines Listenverständnisses - auch das Erstellen von Listen zu erstellen. Effizient, direkt, lesbar ... pythonisch!
Eine Antwort würde sein, Ihre Diktate auf den Wert von Interesse innerhalb eines Generatorausdrucks abzubilden und dann die integrierten Ins anzuwenden min
und max
.
myMax = max(d['price'] for d in myList)
myMin = min(d['price'] for d in myList)
kann dies auch verwenden:
from operator import itemgetter
lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]
max(map(itemgetter('price'), lst))