You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:51:20