首页 > 解决方案 > 根据两个键过滤字典列表

问题描述

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 循环,但似乎找不到正确的代码逻辑。

任何帮助表示赞赏

标签: pythondictionary

解决方案


对字典列表进行重复数据删除的最简单方法是构建一个以唯一字段为键的字典,在本例中为'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字典中(如果有的话,替换之前的值)。


推荐阅读