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.

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)

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.


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!


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)

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))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.