python - 根据两个键过滤字典列表
问题描述
with open('test.csv') as f:
list_of_dicts = [{k:v for k, v in row.items()} for row in csv.DictReader(f, skipinitialspace=True)]
你好,我有一个 csv 文件,我制作了一个字典列表,我想根据“Merchant 1 Price”过滤它在 ASIN 上的输出(如果发现重复,则删除)我想获得更低的价格,不是所有的都有重复即删除重复项(保留商家 1 价格最低的那个),并保留不重复项(在新列表中),这是列表示例
{'Product Name': 'NFL Buffalo Bills Bedding Set, Twin', 'Amazon Price': '84.99', 'ASIN': 'B004B3M5UU', 'Merchant_1': 'Homedepot', 'Merchant_1_Price': '72.65', 'Merchant_1_Stock': 'False', 'Merchant_1_Link': 'https://www.homedepot.com/p/Jaguars-2-PIECE-Draft-Multi-Twin-Comforter-Set-1NFL862000014RET/303181069', 'Amazon Image': '=IMAGE("{temp}",4,100,100)', 'Merchant_1_Image': '=IMAGE("{temp}",4,100,100)'}
{'Product Name': 'NFL Buffalo Bills Bedding Set, Twin', 'Amazon Price': '84.99', 'ASIN': 'B004B3M5UU', 'Merchant_1': 'Overstock', 'Merchant_1_Price': '61.64', 'Merchant_1_Stock': 'False', 'Merchant_1_Link': 'https://www.overstock.com/Bedding-Bath/The-Northwest-Company-NFL-Buffalo-Bills-Draft-Twin-2-piece-Comforter-Set/13330480/product.html', 'Amazon Image': '=IMAGE("{temp}",4,100,100)', 'Merchant_1_Image': '=IMAGE("{temp}",4,100,100)'}
{'Product Name': 'EGO Power+ HT2400 24-Inch 56-Volt Lithium-ion Cordless Hedge Trimmer - Battery and Charger Not Included', 'Amazon Price': '129.0', 'ASIN': 'B00N0A4S1O', 'Merchant_1': 'Homedepot', 'Merchant_1_Price': '129.00', 'Merchant_1_Stock': 'True', 'Merchant_1_Link': 'https://www.homedepot.com/p/EGO-24-in-56-Volt-Lithium-Ion-Cordless-Hedge-Trimmer-Battery-and-Charger-Not-Included-HT2400/205163108', 'Amazon Image': '=IMAGE("{temp}",4,100,100)', 'Merchant_1_Image': '=IMAGE("{temp}",4,100,100)'}
我尝试了很多两个 for 循环,但似乎找不到正确的代码逻辑。
任何帮助表示赞赏
解决方案
对字典列表进行重复数据删除的最简单方法是构建一个以唯一字段为键的字典,在本例中为'ASIN'
. 当您找到重复项时,您可以选择具有较低'Merchant_1_Price'
字段的那个:
by_asin = {}
for item in list_of_dicts:
asin = item['ASIN']
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())
在循环中,我们首先asin
从当前项目中提取 ,因为我们将多次使用它。然后我们检查该 ASIN 是否不在by_asin
字典中,或者如果它在字典中,我们检查新商品的价格是否低于旧商品的价格。在任何一种情况下,我们都将新项目放入by_asin
字典中(如果有的话,替换之前的值)。
推荐阅读
- android - 根据位置上传图片没有火力
- java - 是否需要注册兴趣才能写入 NIO 套接字以发送数据?
- python - 如何将 webhook 事件添加到烧瓶服务器?
- c# - ASP.net MVC 5 项目 SMTP 功能错误
- python-3.x - Lambda 过滤器函数不适用于两个变量
- c - 在 C 中使用整数进行布尔测试
- django - 发布到 Django 表单的时间比使用 Service Worker 后台同步生成的时间晚得多:CSRF 问题
- java - 有没有办法加载用户生成的 fxml?
- swift - 在 SwiftUI 中使用 TabView 时,NavigationView 无法正确显示
- python - RandomForest regression with pandas and sklearn: Input contains NaN, infinity or a value too large for dtype('float32')