Python列表去重并转标题大小写函数逻辑异常问题求助
Python列表去重+首字母大写练习题代码错误排查
问题背景
我是编程新手,选择Python作为首门入门学习语言,起因是Humble Bundle平台的Python学习资源正在促销。借此我接触到PyBites网站,目前正在完成一道列表处理编程练习题,提交的代码仅通过1个测试用例,其余6个均失败,已卡在该练习第三部分较长时间。在PyCharm中运行代码后发现,代码保留了第一个出现的重复项bob belderbos,但未正确处理第二个重复项brad pitt,需要定位代码错误点。
练习用到的原始姓名列表和问题代码如下:
NAMES = ['arnold schwarzenegger', 'alec baldwin', 'bob belderbos', 'julian sequeira', 'sandra bullock', 'keanu reeves', 'julbob pybites', 'bob belderbos', 'julian sequeira', 'al pacino', 'brad pitt', 'matt damon', 'brad pitt'] import re def dedup_and_title_case_names(names): """Should return a list of title cased names, each name appears only once""" name_list = [] name_set = set() for name in names: if name in name_set == set(names): pass else: name_set.add(name) name_list.append(name.title()) return name_list
核心错误点
- 误用Python链式比较语法,判断逻辑完全不符合预期
你写的if name in name_set == set(names)属于Python的链式比较,等价于if (name in name_set) and (name_set == set(names)),和「如果名字已存在于去重集合就跳过」的预期逻辑完全不符。
这个条件几乎永远不会触发:遍历过程中name_set是逐个添加元素的,只有遍历完全部元素后name_set才会和set(names)(全量名字的集合)相等,但此时循环已经结束,所以pass分支从来不会执行,所有重复项本来都会被重复加入结果列表。你观察到的bob belderbos重复项看似被处理只是运行时的巧合,brad pitt的重复项没有被过滤就是逻辑失效的直接表现。 - 冗余导入
代码开头导入了re正则模块,但整个逻辑中没有任何用到该模块的代码,属于无效内容。
修正方案
去重判断只需要校验当前名字是否已经存在于去重集合即可,不需要额外判断集合和全量名字集合是否相等,修正后的代码如下:
NAMES = ['arnold schwarzenegger', 'alec baldwin', 'bob belderbos', 'julian sequeira', 'sandra bullock', 'keanu reeves', 'julbob pybites', 'bob belderbos', 'julian sequeira', 'al pacino', 'brad pitt', 'matt damon', 'brad pitt'] def dedup_and_title_case_names(names): """Should return a list of title cased names, each name appears only once""" name_list = [] name_set = set() for name in names: if name not in name_set: name_set.add(name) name_list.append(name.title()) return name_list
运行该代码会按原始出现顺序返回去重、且每个名单词首字母大写的结果,符合题目要求。
内容的提问来源于stack exchange,提问作者BandedWagon
相关产品推荐
相关产品推荐

