Python字典列表按Name键去重 保留对应price字段最大值
问题场景
手里有个存储字典对象的列表,原始数据如下:
te = [ { "Name": "Bala", "price": 1 }, { "Name": "Bala", "price": 2 }, { "Name": "Bala", "price": 6 }, { "Name": "Bala", "price": 4 }, { "Name": "Bala1", "price": "None" } ]
需求是按Name字段对列表内的字典去重,相同Name的条目保留price字段值最大的那一条。
之前尝试用字典推导式实现:
unique = { each['Name'] : each for each in te }.values()
运行后得到的结果里,Name为'Bala'的条目price值为4,也就是列表中最后一个Name为Bala的条目,和预期结果不符。预期Bala对应的price值应为6,预期结果如下:
[{'Name': 'Bala', 'price': 6 }, {'Name': 'Bala1', 'price': 'None' }]
问题原因
普通字典推导式构建字典时,遇到重复的Key会直接用后遍历到的值覆盖之前存储的内容,整个过程没有做price字段的大小比较,最后留存的自然是列表里最后一个出现的同名条目,不可能保留price最大的条目。
实现方案
单次遍历列表做判断即可,只需要遍历一轮列表就能得到结果,逻辑直观、执行效率高:
name_map = {} for item in te: current_name = item["Name"] # 名字未存入结果,或当前条目price比已存的同名字段price大,就更新存储内容 if current_name not in name_map or item["price"] > name_map[current_name]["price"]: name_map[current_name] = item # 取出字典所有值转成列表,就是最终需要的去重结果 unique = list(name_map.values())
运行上述代码即可得到符合预期的结果。
注意事项
示例数据中Bala1的price是字符串类型的"None",如果后续数据中存在非数值类型的price值,建议提前做类型校验或转换,避免大小比较时触发类型错误。
内容的提问来源于stack exchange,提问作者wenz
相关产品推荐
相关产品推荐

