2014-11-06 58 views
-1

比方說,我有車的名單:Python的選擇指定的項目

car=[{'model':'ferrari', 'color': 'red', 'price':1200}, 
{'model':'lamborgini', 'color': 'blue', 'price':2000}, 
{'model':'ferrari', 'color': 'yellow', 'price':1000}, 
{'model':'ferrari', 'color': 'yellow', 'price':500}] 

我要選擇每一個模型的顏色組合的最便宜的汽車(最廉價的紅藍寶堅尼,最廉價的綠色法拉利等)和把它們放在新的列表中。

輸出應該是:

[{'model':'ferrari', 'color': 'red', 'price':1200}, 
{'model':'lamborgini', 'color': 'blue', 'price':2000}, 
{'model':'ferrari', 'color': 'yellow', 'price':500}] 

我怎樣才能做到這一點?

+0

您能否詳細說明您的問題。也許增加一個例子。我不明白爲什麼'red'+'lamborgini'應該是最便宜的。綠色在你的名單中無處可尋 – Miguellissimo 2014-11-06 01:14:27

+0

@Miguellissimo看看編輯或我的回答 – Monacraft 2014-11-06 01:16:37

回答

0

這是我做過什麼:

car = [ {'model':'ferrari', 'color': 'red', 'price':1200}, 
{'model':'lamborgini', 'color': 'blue', 'price':2000}, 
{'model':'ferrari', 'color': 'yellow', 'price':1000}, 
{'model':'ferrari', 'color': 'yellow', 'price':500} ] 

newcar = [] 

for c in car: 
    new = True 
    for n in newcar: 
     if c['model']==n['model']: 
      if c['color']==n['color']: 
       if c['price'] < n['price']: 
        n['price'] = c['price'] 
        new = False 
    if new: 
     newcar.append(c) 

而且newcar變量將存儲最便宜的。我測試了這個與你的情況,它工作正常。

1

創建幫助數據結構可能是一個好主意。
這裏我用一個字典,元組(型號,顏色)作爲鍵

>>> car = [ {'model':'ferrari', 'color': 'red', 'price':1200}, 
... {'model':'lamborgini', 'color': 'blue', 'price':2000}, 
... {'model':'ferrari', 'color': 'yellow', 'price':1000}, 
... {'model':'ferrari', 'color': 'yellow', 'price':500} ] 
>>> from operator import itemgetter 
>>> from collections import defaultdict 
>>> D = defaultdict(list) 
>>> for item in car: 
...  D[item['model'], item['color']].append(item) 
... 
>>> min(D['ferrari', 'yellow'], key=itemgetter('price')) 
{'color': 'yellow', 'model': 'ferrari', 'price': 500} 

這意味着你不必每次進行查詢

-1
cars = [ {'model':'ferrari', 'color': 'red', 'price':1200}, 
     {'model':'lamborgini', 'color': 'blue', 'price':2000}, 
     {'model':'ferrari', 'color': 'yellow', 'price':1000}, 
     {'model':'ferrari', 'color': 'yellow', 'price':500} ] 
uniques = {} 
for car in cars: 
    if car['model'] not in uniques: 
     uniques[car['model']] = {} 
    if car['color'] not in uniques[car['model']]: 
     uniques[car['model']][car['color']] = float('inf') 
    if car['price'] < uniques[car['model']][car['color']]: 
     uniques[car['model']][car['color']] = car['price'] 
print(uniques) 

輸出時間來掃描整個集合:

{'ferrari': {'yellow': 500, 'red': 1200}, 'lamborgini': {'blue': 2000}} 
+0

爲什麼downvote? – inspectorG4dget 2014-11-06 20:04:42

0

排序和過濾:

# keep models together and sort by lowest price 
srt = sorted(cars, key=lambda x: (x["model"], x["price"])) 

# add cheapest of first model in the list 
final = [srt[0]] 

for d in srt[1:]: 
    if final[-1]["color"] != d["color"]: 
     final.append(d) 
print final 
[{'color': 'yellow', 'model': 'ferrari', 'price': 500}, {'color': 'red', 'model': 'ferrari', 'price': 1200}, {'color': 'blue', 'model': 'lamborgini', 'price': 2000}]