我有这样的连锁条件测试:

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


在代码中:

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


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

最佳答案

if find_num_3 not in {None, i, j}

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

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

Here is a nice article to better understand hashes and sets.

编辑

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

关于python - 缩短测试`if find_num_3!= None和find_num_3!= i和find_num_3!= j的长时间条件:,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55339241/

10-10 23:52