缩短测试`if find_num_3!= None和find_num_3!= i和find_num_3!= j的长时间条件:

Ali*_*ice 1 python

我进行了这样的连锁条件测试:

if find_num_3 != None and find_num_3 != i and find_num_3 != j: #don't reproduce itself
Run Code Online (Sandbox Code Playgroud)

在代码中:

for i in range(len(nums)):
    num_1= nums[i]
    sub_target = target - num_1
    logging.debug(f"level_1_lookup: {lookup}")

    for j in range(i+1, len(nums)):
        num_2 = nums[j] #
        num_3 = sub_target - num_2              
        find_num_3 = lookup.get(num_3) #             

        if find_num_3 != None and find_num_3 != i and find_num_3 != j: #don't reproduce itself    

            result = [num_1, num_2, num_3]
            triplets.append(result)

            logging.debug(f"lookup: {lookup} sub_nums: {nums[j:]} \nresult: {result}")
            logging.info(f"\ttriplets: {triplets}\n\n\n\n")                    
return triplets 
Run Code Online (Sandbox Code Playgroud)

如何将长链转变为紧凑的短结构。

Lou*_*lio 8

if find_num_3 not in {None, i, j}

使用set而不是list或tuple,因为检查集合中元素的存在效率更高。~O(1)而不是复杂O(n)

集将其数据存储为键/值对。关键是存储对象的哈希。这就是为什么您不能在集合中存储具有相同哈希值的多个对象的原因。由于哈希冲突,集合中的状态检查有时可能比O(1)多一点。

这是一篇很好的文章,可以更好地理解散列和集合。

编辑

正如@chepner指出的那样,当仅在运行时(如在问题中)才知道值时,使用元组比使用set更有效,因为set实例化要比tuple实例化长。

  • 考虑到首先要花费O(n)的时间来构建集合,因此创建这样一个小的集合与`[None,i,j]`或`(None,i,j)`是否有任何明显的改进值得商bat。 (3认同)