检查列表中是否有三个符合目标的数字

时间:2014-05-06 17:36:23

标签: python

我需要创建一个函数,将正数列表和正数目标作为输入,如果列表中有三个数字加起来,则返回True

到目前为止,我已经提出了这个问题:

def subsetSum(l, sum):
    found = False
    for i in range(len(l) - 2):
        for j in range(i + 1, len(l) - 1):
            for k in range(j + 1, len(l)):
                return True
    return found

REPL:

>>> subsetSum([5, 4, 10, 20, 15, 19], 38)
True

所以4,15和19的总和等于38,这是我的目标。当我运行此代码时,它会变成True

但是当我运行以下代码时,它仍然是True,尽管数字列表没有三个数字加起来,即10。

>>> subsetSum([5, 4, 10, 20, 15, 19], 10)
True

2 个答案:

答案 0 :(得分:4)

使用itertools.combinations

可能是最简单,最有效的解决方案
from itertools import combinations

def subset_sum(lst, target):
    return len(lst) > 2 and any(sum(x) == target for x in combinations(lst, 3))

示例:

>>> subset_sum([5, 4, 10, 20, 15, 19], 38)
True
>>> subset_sum([10], 38)
False

万一你想坚持自己的代码,以下是解决问题的方法:

def subset_sum(l, target):
    if len(l) < 3:
        return False

    for ki, i in enumerate(l):
        for kj, j in enumerate(l):
            for kk, k in enumerate(l):
                # To make sure we sum elements ONLY on different positions
                if kk != kj and kk != ki and kj != ki and i + j + k == target:
                    return True

    return False

这个解决方案不是很快,但它确实有效。

答案 1 :(得分:0)

你总是回归真实。由于python可以在函数中处理多个return语句,因此不需要找到找到的变量。摆脱找到并在最后返回False。您需要一个if语句来比较sum和输入值,当条件满足时返回True,否则返回False。现在你的代码本质上是一种返回True的复杂方法,你只需要迭代抽象值,而不是将这些值赋值给任何东西,然后在返回找到之前返回True。