функция возвращает None вместо индекса - PullRequest
0 голосов
/ 27 июня 2018

Этот код должен возвращать индекс элемента, который окружен равными суммами элементов

def find_even_index(arr):
    for elem in arr:
        i = arr.index(elem)
        if sum(arr[:i]) == sum(arr[i+1:]):
            return i
        else:
            pass
print find_even_index([1,2,3,4,3,2,1])
print find_even_index([20,10,30,10,10,15,35])

и возвращается

3

нет

вместо Нет должен вернуть 3 , но это не так. Почему ??

Ответы [ 4 ]

0 голосов
/ 27 июня 2018

Проблема в вашем коде в том, что arr.index(elem) всегда возвращает 1 (первый индекс elem в arr), если elem равно 10, во втором вызове find_even_index(). Так что это не может работать.

Я предлагаю вам следующее решение, итерируя непосредственно по индексам, а не по значениям списка:

def find_even_index(arr):
    for i in range(len(arr)):
        if sum(arr[0:i]) == sum(arr[i+1:]):
            return i
    return None

print(find_even_index([1,2,3,4,3,2,1]))          # 3
print(find_even_index([20,10,30,10,10,15,35]))   # 3
0 голосов
/ 27 июня 2018

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

    def func(array, i):
        if sum(array[:i]) == sum(array[i+1:]):
            return i
        else:
            a = i + 1
            return func(array, a)

    print(func([20,10,30,10,10,15,35], 0)) #produces 3 as the answer
0 голосов
/ 27 июня 2018

Проблема со вторым случаем заключается в том, что вы попадаете на четвертую итерацию и ваш скрипт выполняет i = arr.index(10). Вы ожидаете, что это вернет 3, но list.index() находит первый экземпляр 10 в списке, который находится в позиции 1. В этом случае вы на самом деле не хотите перебирать элементов списка, но над их индексами. Попробуйте это:

def find_even_index(arr):
    for i in range(len(arr)):
        if sum(arr[:i]) == sum(arr[i+1:]):
            return i
0 голосов
/ 27 июня 2018

Ваша проблема arr.index(elem) возвращает только первый индекс elem в списке arr.

Для демонстрации:

>>> lst = [1, 2, 3, 1, 2]                                   
>>> lst.index(1)                                            
0                                                           
>>> lst.index(2)                                            
1                                                           
>>> lst.index(3)                                            
2                                           

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

def find_even_index(arr):
    for i, _ in enumerate(arr):
        if sum(arr[:i]) == sum(arr[i+1:]):
            return i

print(find_even_index([1,2,3,4,3,2,1]))  # 3
print(find_even_index([20,10,30,10,10,15,35]))  # 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...