2016-08-08 4 views
0

ラムダ関数を使用している以下のリストを減らしたいと思います。私は最初にリスト全体を繰り返し、条件値に基づいてサブリストに分割できることを知っています。次に、最小価格を得るためにサブリストを繰り返します。条件と価格に基づいて辞書の配列を減らす

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

最終的なリストには、条件ごとに最低価格の項目が1つだけ含まれている必要があります。

あなたが行うことができます
final_list = [{'price':6.9,'condition':'new'},{'price':1.8,'condition':'used'}] 
+2

この質問は、特にスタックオーバーフローのためにフォーマットされていないようで、プログラミングフォーラムの方が適しているかもしれません。 少なくとも何か*試してみることをお勧めしますし、なぜそれが動作しないのか分からない場合はここにあなたのコードを投稿してください。 –

+0

また、注意: 'dict'sを匿名オブジェクトとして使うのは非効率的で(メモリ的に)、普通の' tuple'や適切な 'collections.namedtuple'を使うよりも扱いにくいです。これはJavaScriptではありません。匿名オブジェクトは基本的にストリングキー付き辞書です。 – ShadowRanger

+0

@ShadowRanger上記の行は例を示すために使用されています。データはJSON APIを使用して受信されます。 –

答えて

0

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'}] 

ShadowRangerが指摘するように、あなたがそうのような一回の反復でこれを実行します。

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

この例では、入力を3回繰り返します(ユニークな '条件 'のセットを作成するために1回、次に最小を計算するためにユニークな'条件'ごとに1回)。 OPが避けたかったものと思われた。また、これはPython 3です。これを行う必要がある場合は、set comprehensions(price_listの 'e ['condition'] '})と' min'を避けるリスト内包表記の代わりにジェネレータ式を使用して作業を最小限に抑えることができます中間リスト(e ['condition'] == c) ')の場合、price_listのeの 'min(e [' price '])。 – ShadowRanger

1

私はこのようにそれを行います。

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

'defaultdict'コールバックは' float'値が(理論的に) 'sys.maxsize'を超えることができるので、おそらく' lambda:float( 'inf') 'に変更されるべきです。もちろん、理想的には金銭的価値については 'decimal.Decimal'を使います。 – ShadowRanger

+0

@ShadowRangerありがとうございました。それを変更しました。 –

関連する問題