Удаление индексов в списке на основе определенных значений - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь решить следующее:

Вернуть сумму чисел в массиве, возвращая 0 для пустого массива.За исключением того, что число 13 очень неудачно, поэтому оно не учитывается, и числа, которые приходят сразу после 13, также не учитываются.

Вот то, что у меня есть, идея здесь состоит в том, что 13 и 1 (сразу после этого) удаляются, а затем оставшиеся числа суммируются.Проблема, которую я имею, состоит в том, чтобы удалить часть, это фактически не удаление ничего.Это проблема синтаксиса?

x = [1,2,2,1,13,1]

def sum13(nums):
    for i in nums:
        if i == 13:
            del nums[i:i+1]
    return sum(nums)

print(sum13(x))

20 <-- should be 6

Ответы [ 4 ]

0 голосов
/ 27 ноября 2018

Одна из проблем заключается в том, что вы используете значение элемента списка в качестве индекса.Вот решение с использованием генератора.Сначала определите индекс значений, которые нужно игнорировать, затем создайте новый список, исключающий эти значения.

x = [1,2,2,1,13,1]

def sum13(nums):

    def filter13(nums):
        for n, i in enumerate(nums):
             if i == 13:
                  yield n
                  yield n + 1

    bad_ix = set(filter13(nums))
    new_nums = [x for n, x in enumerate(nums) if n not in bad_ix]
    return sum(new_nums)

sum13(x)
0 голосов
/ 27 ноября 2018

Ваша проблема с вашим индексом.i - это номер в списке, а не индекс.Вот способ решить вашу проблему:

x = [1,2,2,1,13,1]

def sum13(nums):
    for i, num in enumerate(nums):
        if num == 13:
            del nums[i:i+2] # This removes the index i and the index i+1
    return sum(nums)

print(sum13(x))
>>> 6

РЕДАКТИРОВАТЬ: Как упомянул Тьерри Латюиль в комментариях, это неадекватно учитывает случай, когда вы повторили «13».Предполагая, что вы хотите такое поведение, вот способ, которым вы можете сделать это:

def sum13(nums):
    for i, num in enumerate(nums):
        if num == 13:
            stop_cut = i + 1     
            while nums[stop_cut] == 13:
                stop_cut += 1
            del nums[i:stop_cut+1]
    return sum(nums)
0 голосов
/ 27 ноября 2018

Вот пример с рекуррентной функцией.Поскольку в списке содержится 13, мы суммируем все, что до него, и sum13 все, что после этого 13.

x = [1,2,2,1,13,1]

def sum13(nums, first_call=False):
    if not first_call and nums[0] != 13:
        nums = nums[1:]
    if 13 in nums:
        return sum(nums[:nums.index(13)]) + sum13(nums[nums.index(13)+1:])
    return sum(nums)

print(sum13(x, True)) # -> 6

Обратите внимание, что это решение работает с соседними 13 с.

x = [13, 13, 1]
print(sum13(x, True)) # -> 0
0 голосов
/ 27 ноября 2018

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

def sum13(nums):
    sum = 0
    last = None
    for i in nums:
        if i != 13 and last != 13:
             sum += i
        last = i
    return sum
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...