如何使用python lambdas或list comprehensions根据条件获取列表的子集

时间:2016-07-01 09:33:14

标签: python

我有一个像这样的词典列表。

somelist = [
    { "store" : Amazon, "price": 1000},
    { "store" : Junglee, "price": 1200},
    { "store" : BestBuy, "price": 1300},
    { "store" : Amazon, "price": 900},
    { "store" : BestBuy, "price": 1200}
]

我想过滤它,以便我只获得那些具有独特商店且价格最低的字典。所以最终的结果应该是

[
    { "store" : Amazon, "price": 900},
    { "store" : Junglee, "price": 1200},
    { "store" : BestBuy, "price": 1200}
]

在python中执行此操作的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以将词典收集到OrderedDict,其中key是商店,价值是最低价格。然后,您可以使用列表理解轻松地重建字典:

from collections import OrderedDict

d = OrderedDict()
for x in somelist:
    d[x['store']] = min(d.get(x['store'], float('inf')), x['price'])

[{'store': k, 'price': v} for k, v in d.items()] # [{'price': 900, 'store': 'Amazon'}, {'price': 1200, 'store': 'Junglee'}, {'price': 1200, 'store': 'BestBuy'}]

如果不需要保留商店的订购,您也可以使用标准dict

答案 1 :(得分:0)

如果store值的字符串如下:

somelist = 
[
 { "store" : 'Amazon', "price": 1000},
 { "store" : 'Junglee', "price": 1200},
 { "store" : 'BestBuy', "price": 1300},
 { "store" : 'Amazon', "price": 900},
 { "store" : 'BestBuy', "price": 1200}
]

您可以这样做:

unique = set(map(lambda x: x['store'], somelist))
result = [min([__ for __ in somelist if __['store'] == _]) for _ in unique]

结果

[
 {'price': 900, 'store': 'Amazon'},
 {'price': 1200, 'store': 'Junglee'},
 {'price': 1200, 'store': 'BestBuy'}
]