Python函数实现求助:筛选Alice与Silvester安全碰面的地点
问题分析与解决方案
你的代码逻辑出错的核心原因是:你判断的是x和bob中的某一个元素不等,而不是x完全不在bob的路径列表里。比如“Ⅲ”确实在bob的列表中,但当循环到bob里的“Ⅳ”时,x=Ⅲ,c=Ⅳ,满足x !=c,这时候就会把“Ⅲ”错误加入结果,完全不符合需求。
正确的逻辑应该是:
- 先找到Alice和Silvester都去过的地点(交集)
- 再从这些地点里排除所有Bob去过的
简洁的集合实现方式
利用Python的集合操作可以高效解决这个问题,集合的交集、差集操作正好匹配需求:
def affair_meet(bob, alice, silvester): # 转成集合去重,同时方便集合操作 alice_set = set(alice) silvester_set = set(silvester) bob_set = set(bob) # 先取Alice和Silvester的交集,再减去Bob的地点 result = alice_set & silvester_set - bob_set # 如果需要返回列表(和你原代码返回类型一致),就转成list return list(result) if __name__ == '__main__': alice = ['Ⅱ', 'Ⅳ', 'Ⅱ', 'ⅩⅠⅩ', 'ⅩⅤ', 'Ⅳ', 'Ⅲ'] bob = ['Ⅳ', 'Ⅲ', 'Ⅱ', 'ⅩⅩ', 'Ⅱ', 'ⅩⅩ'] silv = ['ⅩⅧ', 'ⅩⅠⅩ', 'Ⅲ', 'Ⅰ', 'Ⅲ', 'ⅩⅧ'] print(affair_meet(bob, alice, silv)) # 输出: ['ⅩⅠⅩ']
如果想用循环实现(适合新手练习)
如果你想通过循环来实现正确逻辑,需要调整判断条件:先判断x在Alice和Silvester中都存在,然后检查x不在整个bob列表里,再去重添加:
def affair_meet(bob, alice, silvester): list1 = [] # 遍历Alice的所有地点(先去重,避免重复判断) for x in set(alice): # 条件1:x在Silvester的路径里;条件2:x不在Bob的路径里 if x in silvester and x not in bob: list1.append(x) return list1
这样就能正确过滤掉Bob去过的“Ⅲ”,只保留符合要求的地点。
内容的提问来源于stack exchange,提问作者Pondo
相关产品推荐
相关产品推荐

