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

Я получаю error: list index out of range. Я думаю, это проблема моего цикла for, но я не понимаю, почему этот код не запускается. Как я могу решить это?

def sum13(nums):
  unlucky = False
  if sum(nums) == 0:
   return 0
  for num in nums:
   x = 0
   if nums[x] == 13:
    unlucky = True
    break
   x += 1
  if unlucky == True:
    return sum(nums) - 13 - nums[x+1]
  if unlucky == False:
    return sum(nums)
1
thornbird 8 Дек 2016 в 13:51

4 ответа

Лучший ответ

Проблема с этим утверждением

if unlucky == True:
    return sum(nums) - 13 - nums[x+1]

Возможно, что последнее число равно 13, и в этом случае nums[x+1] выдаст вам ошибку.

Вместо этого используйте условие

if unlucky == True:
    return sum(nums[:x+1]) - 13
0
mu 無 8 Дек 2016 в 10:55

Для дальнейшего использования, то, как вы можете сделать это, это перебрать до тех пор, пока число (но не включая) число не станет 13, - это сохранит проверку на удачу / неудачу и вычет неудачного числа, а также возможные ошибки индекса Например:

def sum13(nums):
    total = 0
    for num in nums:
        if num == 13:
            break
        total += num
    return total

Или используя itertools.takewhile:

from itertools import takewhile

def sum13(nums):
    until_13 = takewhile(lambda num: num != 13, nums)
    return sum(until_13)

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

def sum13(nums):
    try:
        end = nums.index(13)
    except ValueError:
        end = None
    return sum(nums[:end])
0
Jon Clements 8 Дек 2016 в 11:04
l=range(20)
l1=l[:12]
l2=l[13:]
l1.extend(l2)
res=sum([y for y in l1 if y!=13])
0
khelili miliana 8 Дек 2016 в 11:15

Индекс списка выходит за пределы диапазона только для nums = [13], поскольку этот блок будет отображать x = 0, если 13 находится в nums:

for num in nums:
  x = 0
  if nums[x] == 13:
   unlucky = True
   break
 x += 1

Поэтому nums[x+1] будет вне диапазона для nums = [13].

Другая проблема заключается в том, что в коде не хватает чисел, содержащих 13 раз. Эта корректировка вашего кода будет:

def sum123(nums):
    t = 0
    unlucky = True
    for i in range(len(nums)):
        if nums[i] == 13:
            unlucky = False
        elif unlucky == False and nums[i] != 13:
            unlucky = True        
        else:
            t += nums[i]
    return t
0
Tonechas 8 Дек 2016 в 20:37