如何解决一个有多个解的两和问题?



所以本质上这是一个简单的两和问题,但有多个解决方案。最后,我希望返回给定列表中与目标值相加的所有对,然后在最后计算对的总数并返回它。目前似乎只能返回1对数字。

到目前为止,我的解决方案是尝试实现一个函数来计算添加的数量,虽然这个数字小于列表的总长度,但代码将继续迭代。这证明是无效的,因为它仍然没有考虑到其他解决办法。如有任何帮助,不胜感激

我拿了你的代码,并做了一些调整,在哪里求和被测试,以及如何存储数据。以下是修改后的代码:

def suminlist(mylist,target):
sumlist = []
count = 0
for i in range(len(mylist)):
for x in range(i+1,len(mylist)):
sum = mylist[i] + mylist[x]
if sum == target:
count += 1
worklist = []
worklist.append(mylist[i])
worklist.append(mylist[x])
sumlist.append(worklist)
return count, sumlist
list =  [0, 5, 4, -6, 2, 7, 13, 3, 1] 
print(suminlist(list,4))

要指出的事情

  • sumlist变量定义为没有初始值的列表。
  • 当传递列表中的两个值的总和等于测试值时,它们被放入一个新的临时列表中,然后该列表被附加到求和列表中,同时增加计数值。
  • 一旦所有的列表组合被识别,计数值和汇总列表将返回给调用语句。

以下是您的列表在终端上的测试输出:

@Dev:~/Python_Programs/SumList$ python3 SumList.py 
(2, [[0, 4], [3, 1]])

要从列表中分离计数值,可以考虑按照下面的参考返回多个值拆分返回的数据。

试一试,看看它是否符合你的项目精神。

您可以使用itertools模块来完成此任务。

my_list = [1, 2, 3, 4]
target = 3
out = [x for x in itertools.combinations(my_list, r=2) if sum(x) == target]
print(out)
>>> [(0, 3), (1, 2)]

如果你觉得使用python标准库导入是作弊,上面链接的官方文档展示了"低级别"的示例代码。python实现。

Issue:

返回可能的多个集合中的一个集合的问题仍然存在于第一个返回行(return sumlist)。根据代码,该函数将自动结束函数,作为其和与目标值相同的第一组值。因此,我们需要对它进行调整。

调整:

  1. 我在函数的开头添加了一个列表(finallist[]),用于收集所有可以求和到目制值的适用集合。然后,我在if语句之后添加一个列表(list[])(*因为我在if语句之后创建了一个空列表(list[]),当任何两个值的和满足目制值时,函数将再次清空列表以存储新的两个值集并再次添加到finallist[])。因此,只要一组两个数之和等于目标值,我们就可以将它们附加到列表(list[])中。因此,我又添加了两行代码,将两个值附加到列表(list[])中。最后,我将这个列表(list[])附加到finallist[]。此外,我将返回语句移动到最后一行并调整间距。在此调整之后,该函数不会在发现第一个可能的值集后立即结束。相反,该函数将重复迭代,直到获得所有值集并存储在finalist[]中。
  2. 最初,函数将返回语句(return -1)放在函数的末尾,用于所有集合都不能相加为目标值的情况。但是,在之前的调整之后,原始返回语句(return -1)将没有机会运行,因为所有内容都将在之前的返回行结束(return finallist)。因此,我将其更改为if语句中的else部分(*的意思是:当两个值的总和都不等于目标值时,我们将返回'列表中没有两个值可以加起来等于目标值')

功能变化:

def suminlist(mylist,target):
# count = 0 # delete
# while count < len(mylist): # delete
finallist=[] # add
for i in range(len(mylist)):
for x in range(i+1,len(mylist)):
sum = mylist[i]+mylist[x]
# count = count + 1 # delete
if sum == target:
# sumlist = mylist[i],mylist[x] # delete
# return sumlist # delete
list=[] # add
list.append(mylist[i]) # add
list.append(mylist[x]) # add
finallist.append(list) # add
else: # add
return 'No two values in the list can add up to the target value.' # add
return finallist # add
# return -1 # delete

最终版本:

def suminlist(mylist,target):
finallist=[]
for i in range(len(mylist)):
for x in range(i+1,len(mylist)):
sum = mylist[i]+mylist[x]
if sum == target:
list=[]
list.append(mylist[i])
list.append(mylist[x])
finallist.append(list)
else:
return 'No two values in the list can add up to the target value.'
return finallist

测试代码和输出:

list =  [0, 5, 4, -6, 2, 7, 13, 3, 1] 
print(suminlist(list,100))
# Output: No two values in the list can add up to the target value.
print(suminlist(list,4))
# Output: [[0, 4], [3, 1]]

相关内容

最新更新