Для заданного массива найдите пары элементов, сумма которых равна заданной сумме, и верните сумму их индексов.

Привет, ребята, как вы прочитали в вопросе, я пытаюсь найти пары элементов в массиве, равном заданной сумме, и вернуть сумму их соответствующих индексов.

Мне удалось вернуть пары элементов для заданной суммы, но не удалось вернуть сумму их индексов. Вот мой код:

arr = [1, 4, 2, 3, 0 , 5]
sum = 7

x = min(arr)
y = max(arr)

while x < y:
    if x + y > sum:
        y -= 1
    elif x + y < sum:
        x += 1
    else:
        print("(", x, y, ")")
        x += 1

Мой вывод:

( 2 5 )    
( 3 4 )

Это то, что мне нужно сделать дальше:

2 + 5 = 7 → Индексы 2 + 5 = 7;

3 + 4 = 7 → Индексы 3 + 1 = 4;

7 + 4 = 11 → Вернуть 11;

Заранее спасибо!


person SMM    schedule 16.09.2019    source источник
comment
Не уверен, почему в результате будет возвращено 7 + 4 = 11. Разве сумма не 7 ?   -  person han solo    schedule 16.09.2019
comment
Я пытаюсь добавить сумму индексов пар элементов. (2,5)--›сумма индексов = 7 и (3,4)--›сумма индексов= 4..... затем добавление совокупных индексов 7 + 4 = 11   -  person SMM    schedule 16.09.2019
comment
Из вопроса я вижу, что вы пытаетесь добавить indices пары элементов, чье sum равно некоторому указанному вами числу, скажем, 7, верно?   -  person han solo    schedule 16.09.2019
comment
Да все верно.   -  person SMM    schedule 16.09.2019
comment
Да, поэтому я и спрашиваю, почему в вопросе упоминается 7 + 4 = 11 --> Returns 11   -  person han solo    schedule 16.09.2019


Ответы (3)


вы можете попробовать использовать вложенный цикл:

arr = [1, 4, 2, 3, 0 , 5]
sums = 7
tlist = []
for i in range(len(arr)):
    for j in range(len(arr)-1):
        if (i!=j) and ((arr[i] + arr[j+1]) == sums):
            if (i,j+1) not in tlist and (j+1,i) not in tlist:
                tlist.append((i,j+1))
                print("index ->",i,"   ",j+1)
                print("sum=", i+j+1)

выход:

index -> 1     3
sum= 4
index -> 2     5
sum= 7
person SM Abu Taher Asif    schedule 16.09.2019

Вы можете использовать itertools для простой проверки sum на combinations, например,

>>> import itertools
>>> num = 7
>>> for a,b in itertools.combinations(arr, 2):
...   if a + b == num:
        aindex, bindex = arr.index(a), arr.index(b)
...     indices_sum = aindex + bindex
...     print('[element sum]: {} + {} = {} [indices sum]: {} + {} = {}'.format(a, b, a + b, aindex, bindex , indices_sum))
... 
[element sum]: 4 + 3 = 7 [indices sum]: 1 + 3 = 4
[element sum]: 2 + 5 = 7 [indices sum]: 2 + 5 = 7
>>> arr
[1, 4, 2, 3, 0, 5]
person han solo    schedule 16.09.2019

Вы можете использовать другой подход, вычислив разницу, а затем проверив, присутствует ли каждый элемент в первом массиве или нет.

arr = [1, 4, 2, 3, 0, 5]
the_sum = 7

diff = [the_sum - x for x in arr]
for idx, elem in enumerate(diff):
    try:
        index = arr.index(elem)
        sum_of_indices = idx + index
        print("{} + {} = {}".format(idx, index, sum_of_indices))
    except ValueError:
        pass

выход

1 + 3 = 4
2 + 5 = 7
3 + 1 = 4
5 + 2 = 7

Чтобы удалить дубликаты, всегда легко взять frozenset кортежа индексов.

a = [(2,1), (1,2), (3,2), (2,3)]
{frozenset(x) for x in a} # {frozenset({2, 3}), frozenset({1, 2})}
person MjZac    schedule 16.09.2019
comment
1,3 и 3 ,1 оба одинаковые также 5,2 и 2,5 - person SM Abu Taher Asif; 16.09.2019
comment
Решение может быть изменено в соответствии с потребностями. Если числа не повторяются, достаточно взять набор суммы. - person MjZac; 16.09.2019