Python新手求优化:如何让三元组匹配判断函数更优雅?
更优雅的Python写法优化你的三元组判断函数
你的原代码功能正常,但可以利用Python的集合特性和内置函数大幅简化逻辑,同时提升可读性和性能。
原代码
comboList = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]] #duplicate values wont be entered into these test lists to begin with so idc about that testList1 = [0,1,2] testList2 = [1,2,4,7] testList3 = [0,2,3,6,5,69,4,6,1] testList4 = [2,1,3] #this needs to return false def testfunc(mainList, sublist):#This is the trash func for list in mainList: y1 = 0 x1 = 0 while x1 < len(sublist): if sublist[x1] in list: y1 = y1 + 1 if y1 == 3: return True x1 = x1 + 1 return False if testfunc(comboList,testList1): print("Test1 Pass") else: print("Test1 Fail") if testfunc(comboList,testList2): print("Test2 Pass") else: print("Test2 Fail") if testfunc(comboList,testList3): print("Test3 Pass") else: print("Test3 Fail") if testfunc(comboList,testList4): print("Test4 Fail") else: print("Test4 Pass")
优化后的写法
核心思路
- 将子列表转换为集合:集合的成员查询速度远快于列表(O(1) vs O(n)),适合频繁的
in操作 - 利用
any()内置函数:短路求值,找到第一个满足条件的三元组就立即返回,无需遍历全部 - 用集合的
issubset()方法:直接判断某个三元组是否完全包含在子列表的集合中
优化代码
combo_list = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]] test_list1 = [0,1,2] test_list2 = [1,2,4,7] test_list3 = [0,2,3,6,5,69,4,6,1] test_list4 = [2,1,3] # 需要返回false def has_win_combo(combos, sublist): sub_set = set(sublist) return any(set(combo).issubset(sub_set) for combo in combos) # 测试逻辑简化为循环,避免重复代码 test_cases = [ (test_list1, "Test1 Pass", "Test1 Fail"), (test_list2, "Test2 Pass", "Test2 Fail"), (test_list3, "Test3 Pass", "Test3 Fail"), (test_list4, "Test4 Fail", "Test4 Pass") ] for sublist, pass_msg, fail_msg in test_cases: print(pass_msg if has_win_combo(combo_list, sublist) else fail_msg)
额外优化点
- 变量名改为符合PEP8规范的蛇形命名(比如
comboList→combo_list),提升代码可读性 - 将测试用例整理成列表循环执行,避免重复的
if-else代码块,更易维护 - 如果
combo_list是固定不变的,可以提前把所有三元组转成集合,进一步提升性能:# 提前转换所有组合为集合 combo_sets = [set(combo) for combo in combo_list] def has_win_combo(combos, sublist): sub_set = set(sublist) return any(combo.issubset(sub_set) for combo in combos)
内容的提问来源于stack exchange,提问作者KevinF20
相关产品推荐
相关产品推荐

