如何避免重复添加字典键值对?Python代码逻辑失效求助
问题分析与修复方案
原代码的核心问题
- 判断逻辑错误:
my_list是字典列表,直接检查wiz.first_name或wiz.last_name是否在列表中,本质是判断字符串是否等于列表里的字典元素,永远返回False,会导致重复添加。 - 硬编码内容:不管当前
wiz对象的姓名是什么,都固定添加{"first_name": "Harry", "last_name": "Potter"},完全不符合“添加对应字典”的需求。 - 去重逻辑偏差:需求是判断姓名组合是否存在,原代码单独判断名和姓,逻辑不成立(比如不同的人可能同名或同姓,但组合不同)。
基础修复版本
直接检查目标格式的字典是否已存在于列表中,逻辑简单直观:
wizards = [Wiz_1, Wiz_2, Wiz_3, Wiz_1] my_list = [] for wiz in wizards: # 生成当前巫师对应的字典 current_wiz_dict = {"first_name": wiz.first_name, "last_name": wiz.last_name} # 检查该字典是否未在列表中,不存在则添加 if current_wiz_dict not in my_list: my_list.append(current_wiz_dict)
高效优化版本
如果wizards列表数据量大,遍历列表检查存在性效率较低,可借助集合存储已出现的姓名组合(元组可哈希,适合存入集合),将查询时间从O(n)降到O(1):
wizards = [Wiz_1, Wiz_2, Wiz_3, Wiz_1] my_list = [] seen_name_pairs = set() # 记录已处理过的姓名组合 for wiz in wizards: first_name = wiz.first_name last_name = wiz.last_name name_pair = (first_name, last_name) if name_pair not in seen_name_pairs: seen_name_pairs.add(name_pair) my_list.append({"first_name": first_name, "last_name": last_name})
内容的提问来源于stack exchange,提问作者Coco
相关产品推荐
相关产品推荐

