Suchen Sie in der Liste der Diktate den min () -Wert eines gemeinsamen Diktatfelds

90

Ich habe eine Liste von Wörterbüchern wie folgt:

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

Ich möchte die min () und max () Preise finden. Jetzt kann ich dies einfach genug mit einem Schlüssel mit einem Lambda-Ausdruck sortieren (wie in einem anderen SO-Artikel zu finden). Wenn es also keinen anderen Weg gibt, stecke ich nicht fest. Nach dem, was ich gesehen habe, gibt es in Python fast immer einen direkten Weg, daher ist dies eine Gelegenheit für mich, ein bisschen mehr zu lernen.

Hank Fay
quelle

Antworten:

59

Es gibt mehrere Möglichkeiten. Hier ist eine einfache:

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

[Bearbeiten]

Wenn Sie die Liste nur einmal durchlaufen möchten, können Sie dies versuchen (vorausgesetzt, die Werte können als ints dargestellt werden):

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)
dappawit
quelle
Ich akzeptiere dies als Antwort, da es nicht nur die Antwort gibt, sondern mir auch gezeigt hat, dass man Sequenzen abstrahieren kann. Verdammt, Python ist eine schöne Sprache. Vielen Dank!
Hank Fay
2
Wenn Sie das nicht benötigen seqund die Liste groß ist, kann dies ineffizient sein, da der Speicher für die gesamte Liste zugewiesen werden muss, um die max.
Charles L.
Es wirftAttributeError: module 'sys' has no attribute 'maxint'
Suncatcher
221
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'])

Hier erfahren Sie nicht nur, wie hoch der Höchstpreis ist, sondern auch, welcher Artikel am teuersten ist.

Hugh Bothwell
quelle
4
Ah, das ist eine nette Geste, den gesamten Artikel zurückzugeben. Wird in diesem Fall nicht benötigt, ist aber definitiv ein Hüter für die Zukunft.
Hank Fay
das habe ich gesucht. Genial. Vielen Dank!
Svenwildermann
Eine elegante Lösung!
Anapaulagome
Wie würden Sie dies tun, um die 5 größten Elemente in einer Liste zu finden? (nicht nur das
Maximum
2
@ thomas.mac Sie könnten die Top 5 sortieren und dann auswählen? siehe stackoverflow.com/questions/72899/…
hibernado
40

Ich denke, der direkteste (und pythonischste) Ausdruck wäre so etwas wie:

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

Dadurch wird der Aufwand für das Sortieren der Liste vermieden - und durch die Verwendung eines Generatorausdrucks anstelle eines Listenverständnisses wird auch das Erstellen von Listen vermieden. Effizient, direkt, lesbar ... Pythonic!

dcrosta
quelle
8

Eine Antwort würde Abbildung Ihrer dicts auf den Wert von Interesse innerhalb eines Generators Ausdruck, und dann die Anwendung der Einbauten minund max.

myMax = max(d['price'] for d in myList)
myMin = min(d['price'] for d in myList)
rlibby
quelle
Nitpick: Das sind Generatorausdrücke. Listenverständnisse sind von [und umgeben und ]generieren als Zwischenschritt eine Python-Liste.
dcrosta
@dcrosta, ja, danke, du hast natürlich recht. Ich habe den Wortlaut geändert, da das peinlich war.
Rlibby
3

kann auch Folgendes verwenden:

from operator import itemgetter

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