【问题标题】:List Index Out of Range for list[0]列表 [0] 的列表索引超出范围
【发布时间】:2018-04-09 16:07:30
【问题描述】:

我正在尝试编写一个简单的代码,它采用一个列表 (nums) 并对列表中的数字求和,只要数字不是 13 或不会在 13 之后立即出现。这是我的代码:

def sum13(nums):
   sum = 0
   if nums[0] != 13:
      sum += nums[0]
   for i in range(len(nums)):
      if nums[i] != 13 and nums[i - 1] != 13:
         sum += nums[i]
   return sum

我不断收到编译错误:“列表索引超出范围”。我没有更改列表的索引,当我调用 nums[0] 时,它位于将 i 限制在 0 和 len(nums) 之间的 for 循环之外,所以我不知道如何解决这个问题,或者如何以更优雅的方式编写代码以消除问题。

【问题讨论】:

  • 列表是否为空? E:你确定错误没有显示在这一行:if nums[i] != 13 and nums[i - 1] != 13:
  • 顺便说一下,这是运行时错误,而不是编译错误
  • 你需要包含调用这个函数的代码,我怀疑这将是错误的根源。
  • 您还需要提供输入和输出的样本
  • 如果 nums 为空,则会引发错误。顺便说一句,我认为在这种情况下“C 风格的语句”可能会更好,因为可以在循环中修改迭代变量,如果当前元素是 13,则可以跳过下一个元素。Python 中没有这样的for statement,幸运的是,您可以使用 while 来做到这一点。

标签: python list indices


【解决方案1】:

如果nums[],访问nums[0] 将引发IndexError

顺便说一句:如果使用while-loop,你会得到一个更简单的解决方案,见下文:

def sum13(nums):
    sum = 0
    i = 0
    while i < len(nums):
        x = nums[i]
        if x == 13:
            # skip current element and next element
            i += 2
        else:
            sum += x
            i += 1
    return sum

【讨论】:

    【解决方案2】:

    有趣...我试过你的代码看起来不错,但它不会像你想要的那样运行...

    我试过了:

    def sum13(nums):
       sum = 0
       if nums[0] != 13:
          sum += nums[0]
       for i in range(len(nums)):
          print 'Current number:', str(nums[i])
          print 'Previous number:', str(nums[i-1])
          if nums[i] != 13 and nums[i - 1] != 13:
             sum += nums[i]
       return sum
    
    ls = [10,11,13,12,14,14]
    print 'Total sum:', str(sum13(ls))
    

    返回 59,应该是 (10+11+14+14) = 49。

    为什么会这样?这是因为您签入了循环 nums[i-1]。

    因为在第一个循环中 i = 0,所以 i-1 = -1。因此,nums[-1] 是列表中的最后一项。

    你可以试试这个小测试吗?

    解决此问题的一种方法是:

    def sum13(nums):
       sum = 0
       if nums[0] != 13:
          sum += nums[0]
       for i in range(1, len(nums)):
          print 'Current number:', str(nums[i])
          print 'Previous number:', str(nums[i-1])
          if nums[i] != 13 and nums[i - 1] != 13:
             sum += nums[i]
       return sum
    
    ls = [10,11,13,12,14,14]
    print 'Total sum:', str(sum13(ls))
    

    如果仍然无法正常工作,您可以分享您的代码和测试吗?

    如 cmets 中所述:

    def sum13(nums):
       if nums:
          sum = 0
          if nums[0] != 13:
             sum += nums[0]
          for i in range(1, len(nums)):
             print 'Current number:', str(nums[i])
             print 'Previous number:', str(nums[i-1])
             if nums[i] != 13 and nums[i - 1] != 13:
                sum += nums[i]
          return sum
       if not nums:
          print 'Empty list'
    ls = [10,11,13,12,14,14]
    print 'Total sum:', str(sum13(ls))
    ls2 = []
    print sum13(ls2)
    

    干杯,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-16
      • 2011-06-14
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多