【问题标题】:Error:list index out of range in my loop?错误:我的循环中的列表索引超出范围?
【发布时间】:2016-12-08 10:51:07
【问题描述】:

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

【问题讨论】:

    标签: python


    【解决方案1】:

    问题出在这句话上

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

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

    改为使用条件

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

    【讨论】:

    • @thornbird 酷。如果有帮助,别忘了accept and upvote the answer :)
    • 我认为索引错误仅针对 nums = [13] 引发。
    • @Petruz 不,对于 nums = [1, 13]、nums = [1, 2, 13]、nums = [..., 13] 等会​​引发错误。最后一个数字必须是 13。
    • nums[x+1] 将始终为 nums[1],因为 x = 0。我只收到 nums = [13] 的索引错误,而 [..,. .13] 因为存在一个 nums[1].
    • X 在循环内被重置为 0,循环中断,x 为 0。
    【解决方案2】:

    为了将来参考,您可以如何执行此操作,直到数字(但不包括)数字为 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])
    

    【讨论】:

      【解决方案3】:
      l=range(20)
      l1=l[:12]
      l2=l[13:]
      l1.extend(l2)
      res=sum([y for y in l1 if y!=13])
      

      【讨论】:

        【解决方案4】:

        只有nums = [13] 的列表索引超出范围,因为如果nums 中有13,则此块将呈现x = 0

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-14
          • 1970-01-01
          • 1970-01-01
          • 2016-10-03
          • 2019-05-21
          相关资源
          最近更新 更多