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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:26:13