Python 数之和

Python 数之和,python,list,sum,numbers,Python,List,Sum,Numbers,我一直在做一个程序,在一个随机列表中找到两个数字,如果它们的和是8,就打印出来。 老实说,我已经在这里坐了半个小时了,不知发生了什么事。我想我已经非常接近了,但在极少数情况下,它没有找到一个现有的组合(list=[1,4,4,9]->没有组合)。而且在极少数情况下,我会得到一个错误的说法 RecursionError: maximum recursion depth exceeded in comparison 这是我的密码: import random list = [] for i in

我一直在做一个程序,在一个随机列表中找到两个数字,如果它们的和是8,就打印出来。 老实说,我已经在这里坐了半个小时了,不知发生了什么事。我想我已经非常接近了,但在极少数情况下,它没有找到一个现有的组合(list=[1,4,4,9]->没有组合)。而且在极少数情况下,我会得到一个错误的说法

RecursionError: maximum recursion depth exceeded in comparison
这是我的密码:

import random
list = []
for i in range(1,5,1):
    newNum = random.randint(1,10)
    list.append(newNum)
list.sort()
sum = 8
print('\nRandomly generated list:')
print(list)
firstNum = list[0]
lastNum = list[-1]
newList = []
def isSum(a,b):
    if a + b == sum:
        if list.index(a) == list.index(b):
            print('\nThere isnt a combination.')
        else:
            newList.append(a)
            newList.append(b)
            print('\nCombination:')
            print(newList)
    elif a + b < sum:
        temp = list.index(a)
        temp += 1
        if temp > list.index(lastNum):
            print('\nThere isnt a combination.')
        else:
            a = list[temp]
            isSum(a,b)
    else:
        temp = list.index(b)
        temp -= 1
        if temp < list.index(firstNum):
            print('\nThere isnt a combination.')
        else:
            b = list[temp]
            isSum(a,b)
isSum(firstNum,lastNum)
随机导入
列表=[]
对于范围(1,5,1)内的i:
newNum=random.randint(1,10)
list.append(newNum)
list.sort()
总和=8
打印('\n随机生成的列表:')
打印(列表)
firstNum=list[0]
lastNum=list[-1]
新列表=[]
def isSum(a、b):
如果a+b==总和:
如果列表索引(a)=列表索引(b):
打印(“\n没有组合”。)
其他:
newList.append(a)
newList.append(b)
打印(“\n组合:”)
打印(新列表)
elif a+b<总和:
临时=列表索引(a)
温度+=1
如果临时>列表索引(lastNum):
打印(“\n没有组合”。)
其他:
a=列表[临时]
isSum(a,b)
其他:
临时=列表索引(b)
温度-=1
如果温度<列表索引(firstNum):
打印(“\n没有组合”。)
其他:
b=列表[温度]
isSum(a,b)
isSum(firstNum,lastNum)

我只是一个初学者,如果我犯了一个愚蠢的错误,请不要生气:3

您可以使用
itertools
模块生成列表的所有组合,然后通过计算每个组合的
和来过滤,例如:

导入itertools
a=[1,4,4,9]#任何NUM列表
组=2
结果=8
组合=[在itertools中组合的组合。组合(a,组)]
输出=[如果总和(组合)=结果,则组合中的组合的组合]
打印(输出)
>>> [(4, 4)]

递归在Python中并不理想,您的代码当然可以简化


这将返回所有对

将itertools导入为itt
随机输入
从键入导入列表、元组
def是_comb_sum(nums:List[int],comb_size:int,target_sum:int)->List[Tuple[int,…]:
梳子=[]
对于itt.组合中的电流对(NUM、梳状尺寸):
电流总和=总和(电流对)
如果curr\u sum==target\u sum:
梳子追加(当前对)
回程梳
nums_list=[random.randint(0,10)表示范围(5)]
打印(nums\U列表)
res=是comb和(nums列表,2,8)
打印(res)

如果您只想打印每个组合一次,可以使用集合来标识存在的不同数字。然后,对于这些数字中的每一个,您确定需要哪个互补值来达到目标(8),如果它也在集合中,则该对存在。唯一的例外是当数字正好是目标的一半(即4)时,在这种情况下,您必须确保列表中至少有两个该数字的实例:

target  = 8
count   = 4

numbers = [random.randint(1,10) for _ in range(count)]    
print(numbers)

numberSet = set(numbers)
for number in numberSet:
    other = target-number
    if other not in numberSet: continue
    if other > number: continue # avoid duplicates such as 2+6=8 and 6+2=8
    if other == number and numbers.count(number) < 2: continue
    print(number,"+",other,"=",target)
如果要打印所有组合,可以使用采集模块中的计数器对象,打印出现次数或重复打印行:

target  = 12
count   = 8

numbers = [random.randint(1,10) for _ in range(count)]    
print(numbers)

from collections import Counter
numberCounts = Counter(numbers)
for number in numberCounts:
    other = target-number
    if other > number: continue
    pairCount  = numberCounts[number] * numberCounts[other]
    if number == other:
        pairCount = (pairCount - numberCounts[number]) // 2
    if pairCount > 0:
        print(number,"+",other,"=",target,"occurred",pairCount,"time(s)")
产出(8人名单中12人的目标):


看看你想做什么,看看你的代码长度,你让它变得比必须知道XD更复杂,但我不知道如何做得不同,我是pythonOne的新手重要提示,不要以隐藏内置名称的方式命名变量(变量
list
隐藏内置的
list
对象或方法)我不知道,我的坏消息,如果没有组合,我可以显示消息吗?@MirsenKahrovic您将得到一个空列表,您可以使用
如果输出:
来知道是否有正确的组合,如果找不到,则使用
其他:
target  = 12
count   = 8

numbers = [random.randint(1,10) for _ in range(count)]    
print(numbers)

from collections import Counter
numberCounts = Counter(numbers)
for number in numberCounts:
    other = target-number
    if other > number: continue
    pairCount  = numberCounts[number] * numberCounts[other]
    if number == other:
        pairCount = (pairCount - numberCounts[number]) // 2
    if pairCount > 0:
        print(number,"+",other,"=",target,"occurred",pairCount,"time(s)")
[7, 6, 5, 5, 6, 6, 3, 4]
7 + 5 = 12 occurred 2 time(s)
6 + 6 = 12 occurred 3 time(s)