错误:在循环中列出索引超出范围?

时间:2016-12-08 10:51:08

标签: python

问题是:返回数组中数字的总和,为空数组返回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)

4 个答案:

答案 0 :(得分:0)

问题在于这个陈述

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

最后一个数字可能是13,在这种情况下nums[x+1]会给你错误。

相反,请使用条件

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

答案 1 :(得分:0)

为了将来参考,你如何做到这一点是循环直到数字(但不包括)数字是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])

答案 2 :(得分:0)

l=range(20)
l1=l[:12]
l2=l[13:]
l1.extend(l2)
res=sum([y for y in l1 if y!=13])

答案 3 :(得分:0)

您的列表索引仅在nums = [13]范围之外,因为如果13位于x = 0,此块将呈现nums

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

因此nums[x+1]将超出nums = [13]的范围。

另一个问题是代码在包含13次的nums中是不够的。这种代码调整将:

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