Как найти индекс равенства суммы левых и правых элементов?
Задача: дан список чисел [4, 1, 7, 9, 3, 9], необходимо найти индекс элемента, в котором сумма левых и сумма правых элементов будет равна: 4 + 1 + 7 = 12 и 3 + 9 = 12.
Ничего кроме этого не пришло на ум:
def midpoint_sum(a):
ans = []
sum_a = 0
for i in a:
sum_a += i
ans.append(sum_a)
ans2 = []
sum_a2 = 0
for i in a[::-1]:
sum_a2 += i
ans2.append(sum_a2)
ans3 = [i for i in range(len(ans[1:])) if ans[i] in ans2[1:]]
return (ans3[-1])
А в итоге еще и ответы не правильные получается.
Ответы (4 шт):
здесь удобнее всего использовать срезы и встроенную функцию sum():
lst = [4, 1, 7, 9, 3, 9]
res = 0
for i in range(1, len(lst)):
if sum(lst[:i]) == sum(lst[i+1:]):
res = i
break
print(res)
PS если res == 0 - это значит условие равенства не выполняется для любого индекса списка.
Вот так например:
list = [4, 1, 7, 9, 3, 9]
el = next(id for id,x in enumerate(list) if sum(list[0:id]) == sum(list[id+1:]))
print(el)
UPD: Подсмотрел в ответе @MaxU и упростил немного
можно сделать так (в одну строчку без дополнительных функций или развёрнутых циклов):
lst = [4, 1, 7, 9, 3, 9]
index = max(pos if sum(lst[:pos]) == sum(lst[pos + 1:]) else -1 for pos in range(len(lst)))
print(index)
в этом случае, если такого индекса не существует, то будет возвращено -1
Если препод спросит - "А оптимально ли квадратичное решение?", то можно использовать алгоритм с линейной сложностью
(кстати, ваша задумка тоже линейная, только память тратит, чего можно избежать, да и нужно было сравнивать определённые элементы списков сумм)
a = [4, 1, 7, 9, 3, 9]
rs = sum(a) #сумма справа
ls = 0 #сумма слева
idx = -1
for i, x in enumerate(a):
rs -= x
if rs == ls:
idx = i
ls += x
print(idx)