Python编写多列表共有元素查找脚本的逻辑问题排查
问题场景
Smith博士在工作室被他的一名继承人用刀杀害,需编写Python脚本找出真凶,已知三类人员清单:
- 继承人名单:Aiden、Tori、Lucas、Isabelle
- 案发时在工作室的人员名单:Lucas、Natalie、Tori
- 持有刀具的人员名单:Isabelle、Tori、Natalie
原有代码的问题
你贴出的原有代码如下:
heirs = ["Aiden", "Tori", "Lucas", "Isabelle"] ppleinstudio = ["Lucas", "Natalie", "Tori"] knife = ["Isabelle", "Tori", "Natalie"] # killer is the one who exists in three of the lists # merge the lists merged = [*heirs,*ppleinstudio,*knife] L1=[] for i in merged: if i not in L1: L1.append(i) else: print(i,end=' ')
这段代码的核心逻辑缺陷是没有实现「判断元素是否同时存在于三个独立名单」的校验,当前逻辑只是把三个列表拼接后,打印所有在拼接列表里重复出现的元素:
- 只要元素在拼接列表里第二次出现就会被输出,完全不统计这个元素实际覆盖了几个名单
- 比如Lucas只在继承人、工作室两个名单里,不在持刀名单中,因为在拼接列表里第二次出现就被错误打印;Isabelle只在继承人、持刀名单里,不在工作室名单中,同样被错误输出;Natalie在工作室、持刀名单里,不属于继承人,也被错误打印,最终结果完全不符合要求。
正确实现方案
真凶必须同时满足三个条件:是Smith的继承人、案发时在工作室、持有刀具,本质是求三个名单的交集,两种常用实现方式:
方法1:集合交集运算(最简洁高效)
Python集合原生支持交集运算,不需要手动遍历计数,代码可读性最高:
heirs = ["Aiden", "Tori", "Lucas", "Isabelle"] people_in_studio = ["Lucas", "Natalie", "Tori"] knife_holders = ["Isabelle", "Tori", "Natalie"] # 对三个集合取交集,得到同时在三个名单中的人 killer = set(heirs) & set(people_in_studio) & set(knife_holders) print(f"真凶是:{list(killer)[0]}")
运行后输出:真凶是:Tori
方法2:手动遍历校验(适配原有代码思路)
如果要沿用遍历判断的写法,需要补全三个名单的同时存在校验,不能对拼接后的列表做重复判断:
heirs = ["Aiden", "Tori", "Lucas", "Isabelle"] people_in_studio = ["Lucas", "Natalie", "Tori"] knife_holders = ["Isabelle", "Tori", "Natalie"] # 先拿到所有涉及的人员去重 all_people = set(heirs + people_in_studio + knife_holders) for person in all_people: # 逐个判断是否同时满足三个凶手条件 if person in heirs and person in people_in_studio and person in knife_holders: print(f"真凶是:{person}")
内容的提问来源于stack exchange,提问作者kpackq
相关产品推荐
相关产品推荐

