我需要创建一个函数,将正数列表和正数目标作为输入,如果列表中有三个数字加起来,则返回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
答案 0 :(得分:4)
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。