python - 过滤字典列表以获得最低价格
问题描述
我具有以下功能,可根据“价格”和“库存”从列表中删除“半重复”字典(仅保留其中一个字典)。我目前的代码获得了库存商品的最低价格,但是,如果所有“半重复”都缺货,我想改进它以获得最低商品,即以最低价格获取商品(库存商品的优先级)总是以更高的价格,否则商品缺货的最低价格)
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())
解决方案
你可以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< y1
x2≤ y2
由于False
小于True
,因此这意味着我们在这里看到的项目e
与if that was 一样e['Merchant_1_Stock']
小。如果多个项目有as ,我们将按.True
False
e['Merchant_1_Stock']
True
e['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'}]
推荐阅读
- php - 参数必须是实现Countable HTML2PDF php的数组或对象
- c++ - 如何在微过滤器中的 IRP_Create 上获取复制文件的源路径
- apache-kafka-streams - KafkaStreams 如何实例化 ConsumerRecordFactory?
- python - .我有一个查询,为什么 print(emp.__repr__()) 不给出传递 3 个参数 ved, root, 5000 的错误,因为 __repr__() 只有 self 作为参数
- react-native - React Native - 带列的水平滚动
- google-analytics - 无法匹配 GA 高级细分和 BigQuery 结果
- callback - 我如何编写按键回调?
- swift - 错误枚举 - 案例的常用参数
- python - 使用 GridSearchCV 控制预测 > 0
- strapi - 与模型相关的strapi POST文件到/上传失败