2016-08-08 6 views
0

Ich möchte die folgende Liste vielleicht mit einer Lambda-Funktion reduzieren. Ich weiß, dass ich zuerst über die gesamte Liste iterieren und sie in Teillisten basierend auf dem Zustandswert aufteilen könnte. Dann würde ich über die Unterlisten iterieren, um den Mindestpreis zu erhalten.Reduzierung einer Reihe von Wörterbüchern auf der Grundlage von Zustand und Preis

price_list = [{'price':10.8,'condition':'new'},{'price':6.9,'condition':'new'},{'price':3.8,'condition':'used'},{'price':1.8,'condition':'used'}] 

Die endgültige Liste sollte nur einen Artikel pro Bedingung mit dem Mindestpreis enthalten.

final_list = [{'price':6.9,'condition':'new'},{'price':1.8,'condition':'used'}] 
+2

Diese Frage scheint für einen Stack-Überlauf nicht besonders gut formatiert zu sein und eignet sich möglicherweise besser für ein Programmierforum. Ich würde empfehlen zumindest versuchen * etwas * und dann posten Sie Ihren Code hier, wenn Sie nicht herausfinden, warum es nicht funktioniert. –

+0

Auch Randbemerkung: Verwenden von 'dict's als anonyme Objekte ist ineffizient (Speicher-weise) und schwieriger als die Verwendung von einfachen' Tupel's oder einem passenden 'collections.namedtuple'. Dies ist kein JavaScript, bei dem anonyme Objekte im Grunde Wörterbücher mit Zeichenfolgen sind. – ShadowRanger

+0

@ShadowRanger Die obigen Zeilen dienen nur als Beispiel. Daten werden mit einer JSON-API empfangen. –

Antwort

0

können Sie tun:

li=[] 
for c in {e['condition'] for e in price_list}: 
    di={} 
    di['price']=min(e['price'] for e in price_list if e['condition']==c) 
    di['condition']=c 
    li.append(di) 

>>> li 
[{'price': 6.9, 'condition': 'new'}, {'price': 1.8, 'condition': 'used'}] 

Wie ShadowRanger weist darauf hin, können Sie dies wie so in einer Iteration tun:

dd=defaultdict(lambda: float('inf')) 
for itemdict in price_list: 
    cond = itemdict['condition'] 
    dd[cond] = min(dd[cond], itemdict['price']) 

li=[] 
for k, v in dd.items(): 
    li.append({'price':v, 'condition':k}) 
+1

Dies iteriert die Eingabe dreimal für den Beispielfall (einmal, um die Menge der eindeutigen "Bedingungen" zu erstellen, dann einmal pro eindeutige "Bedingung", um das Minimum zu berechnen). Was etwas zu sein schien, was die OP vermeiden wollte. Auch dies ist Python 3, wenn Sie dies tun müssen, können Sie die Arbeit mit Set-Comprehensions ('{e ['Bedingung'] für e in price_list}') und Generator-Ausdrücke statt Listen-Comprehensions für 'min' zu vermeiden Zwischenlisten ('min (e ['price'] für e in price_list wenn e ['condition'] == c)'). – ShadowRanger

1

ich es wie folgt tun:

from collections import defaultdict 
import sys 
d = defaultdict(lambda: float('inf')) 

for x in price_list: 
    d[x['condition']]=min(d[x['condition']],x['price']) 
[{ 'price':v, 'condition':k } for k,v in d.items() ] 

#output: 
[{'price': 1.8, 'condition': 'used'}, {'price': 6.9, 'condition': 'new'}] 
+0

Der 'defaultdict' Callback sollte wahrscheinlich in' lambda: float ('inf') 'geändert werden, da' float' Werte (theoretisch) 'sys.maxsize' überschreiten könnten. Im Idealfall würden Sie für Geldwerte "decimal.Decimal" verwenden. – ShadowRanger

+0

@ShadowRanger Danke. Änderte es. –

Verwandte Themen