首页 > 解决方案 > 过滤字典列表以获得最低价格

问题描述

我具有以下功能,可根据“价格”和“库存”从列表中删除“半重复”字典(仅保留其中一个字典)。我目前的代码获得了库存商品的最低价格,但是,如果所有“半重复”都缺货,我想改进它以获得最低商品,即以最低价格获取商品(库存商品的优先级)总是以更高的价格,否则商品缺货的最低价格)

my_list=[{"Product Name":"x","Merchant_1_Price":"33","Merchant_1_Stock":True,"Seller":"y"},
{"Product Name":"x","Merchant_1_Price":"25","Merchant_1_Stock":False,"Seller":"y1"},
{"Product Name":"x","Merchant_1_Price":"32","Merchant_1_Stock":True,"Seller":"y1"},
{"Product Name":"x","Merchant_1_Price":"42","Merchant_1_Stock":True,"Seller":"y2"},
{"Product Name":"x1","Merchant_1_Price":"100","Merchant_1_Stock":True,"Seller":"z1"},...
]
by_asin = {}
for item in my_list:
    if item['Merchant_1_Stock'] == False:
        continue
    asin = item['Product Name']
    if (
        asin not in by_asin or
        float(item['Merchant_1_Price']) < float(by_asin[asin]['Merchant_1_Price'])
    ):
        by_asin[asin] = item
deduplicated_list_of_dicts = list(by_asin.values())

标签: python

解决方案


你可以min(..)在这里使用。作为关键,您需要一个 2 元组:首先是 的否定Merchant_1_Stock,然后是Merchant_1_Price,例如:

min(my_list, key=lambda e: (not e['Merchant_1_Stock'], float(e['Merchant_1_Price'])))

对于您给定的样本数据,结果是:

>>> min(my_list, key=lambda e: (not e['Merchant_1_Stock'], float(e['Merchant_1_Price'])))
{'Product Name': 'x', 'Merchant_1_Price': '32', 'Merchant_1_Stock': True, 'Seller': 'y1'}

Python 按字典顺序对元组进行排序。所以这意味着它认为给定;或。(x1, x2) ≤ (y1, y2)x1< y1x2≤ y2

由于False小于True,因此这意味着我们在这里看到的项目e与if that was 一样e['Merchant_1_Stock']小。如果多个项目有as ,我们将按.TrueFalsee['Merchant_1_Stock']Truee['Merchant_1_Price']

例如,您可以使用此逻辑来获得每件商品最便宜的价格。我们可以首先使用 adefaultdict对每个项目进行分组,然后获得最小值。喜欢:

from collections import defaultdict

products = defaultdict(list)
for item in my_list:
    products[item['Product Name']].append(item)

result = {
    k: min(vs, key=lambda e: (not e['Merchant_1_Stock'], float(e['Merchant_1_Price'])))
    for k, vs in products.items()
}
list(result.values())

然后产生:

>>> {
...     k: min(vs, key=lambda e: (not e['Merchant_1_Stock'], float(e['Merchant_1_Price'])))
...     for k, vs in products.items()
... }
{'x': {'Product Name': 'x', 'Merchant_1_Price': '32', 'Merchant_1_Stock': True, 'Seller': 'y1'}, 'x1': {'Product Name': 'x1', 'Merchant_1_Price': '100', 'Merchant_1_Stock': True, 'Seller': 'z1'}}

或对于值:

>>> list(result.values())
[{'Product Name': 'x', 'Merchant_1_Price': '32', 'Merchant_1_Stock': True, 'Seller': 'y1'}, {'Product Name': 'x1', 'Merchant_1_Price': '100', 'Merchant_1_Stock': True, 'Seller': 'z1'}]

推荐阅读