Если вы хотите распечатать каждую комбинацию только один раз, вы можете использовать набор для идентификации имеющихся чисел. Затем для каждого из этих чисел вы определяете, какое дополняющее значение необходимо для достижения вашей цели (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)
Вывод :
[7, 2, 6, 1]
6 + 2 = 8
7 + 1 = 8
Если вы хотите распечатать все комбинации, вы можете использовать объект Счетчик из модулей сбора и либо распечатать число вхождений, либо повторить напечатанные строки:
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)")
Вывод (цель 12 в списке из 8):
[7, 6, 5, 5, 6, 6, 3, 4]
7 + 5 = 12 occurred 2 time(s)
6 + 6 = 12 occurred 3 time(s)