Python列表操作函数逻辑错误:平方立方判断结果不符
Python函数list_oper逻辑错误排查
问题描述
现有一个Python函数list_oper,接收两个列表作为输入,用于检查list1中所有元素的平方或立方是否存在于list2中,并返回对应描述字符串。但当传入测试用例list1=[1,2,3,4]、list2=[1,8,27,64,100]时,函数输出“Squares are only present”,而实际预期应为“Cubes are only present”。
原函数代码
def list_oper(list1,list2): square_nums = list(map(lambda x: x ** 2, list1)) cube_nums = list(map(lambda x: x ** 3, list1)) if (x in square_nums for x in list2): print("Squares are only present") elif(x in cube_nums for x in list2): print("Cubes are only present") else: print("No such pattern is present")
if __name__=='__main__': import ast list1 = ast.literal_eval(input()) list2 = ast.literal_eval(input()) print(list_oper(list1,list2))
逻辑错误分析
生成器表达式的布尔判断错误
原代码中的条件(x in square_nums for x in list2)是一个生成器对象,在Python的布尔上下文里,生成器对象本身被视为True,不会实际遍历检查所有元素是否满足条件。这导致第一个if分支永远会被触发,不管实际数据是否符合预期,这就是测试用例输出错误的核心原因。逻辑判断方向完全颠倒
函数的需求是检查list1中所有元素的平方/立方是否存在于list2中,但原代码却在检查list2的元素是否属于list1元素的平方/立方列表,完全搞反了判断逻辑。正确的逻辑应该是验证list1中每个元素的平方是否都在list2里,或者每个元素的立方是否都在list2里。缺少返回值导致冗余输出
原函数仅通过print输出结果,但主函数中又调用了print(list_oper(...)),而list_oper没有return语句,会默认返回None,最终会导致控制台额外输出一个None。
修正后的代码
def list_oper(list1, list2): # 检查list1所有元素的平方是否都在list2中 all_squares_in = all(x ** 2 in list2 for x in list1) # 检查list1所有元素的立方是否都在list2中 all_cubes_in = all(x ** 3 in list2 for x in list1) if all_squares_in: return "Squares are only present" elif all_cubes_in: return "Cubes are only present" else: return "No such pattern is present" if __name__=='__main__': import ast list1 = ast.literal_eval(input()) list2 = ast.literal_eval(input()) print(list_oper(list1, list2))
测试验证
传入测试用例list1=[1,2,3,4]、list2=[1,8,27,64,100]时:
list1元素的平方为[1,4,9,16],其中4、9、16不在list2中,所以all_squares_in为Falselist1元素的立方为[1,8,27,64],所有元素都在list2中,所以all_cubes_in为True- 最终函数返回“Cubes are only present”,符合预期。
内容的提问来源于stack exchange,提问作者Priyanka
相关产品推荐
相关产品推荐

