在python练习中,For循环在两个实例中失败

在python练习中,For循环在两个实例中失败,python,Python,我是python新手,一直在做在线练习,想知道是否有人能解释为什么下面的解决方案失败了。我有两个解决方案,每个解决方案都会产生不同的故障,如输出所示。谢谢 另外,为什么我需要在第二块代码中分配一个变量,而不是第一块?如果我没有分配变量,我会得到一个弹出索引超出范围错误 问题 返回数组中数字的总和,空数组返回0。除此之外,数字13是非常不吉利的,所以它不算数,紧跟在13之后的数字也不算数 sum13([1, 2, 2, 1]) → 6 sum13([1, 1]) → 2 sum13([1, 2,

我是python新手,一直在做在线练习,想知道是否有人能解释为什么下面的解决方案失败了。我有两个解决方案,每个解决方案都会产生不同的故障,如输出所示。谢谢

另外,为什么我需要在第二块代码中分配一个变量,而不是第一块?如果我没有分配变量,我会得到一个
弹出索引超出范围错误

问题

返回数组中数字的总和,空数组返回0。除此之外,数字13是非常不吉利的,所以它不算数,紧跟在13之后的数字也不算数

sum13([1, 2, 2, 1]) → 6
sum13([1, 1]) → 2
sum13([1, 2, 2, 1, 13]) → 6
解决方案1

def sum13(nums):
    for i in nums: 
      if i == 13 and (nums.index(i) > len(nums) - 2):
        nums.pop(nums.index(i))
        continue       
      if i == 13 and (nums.index(i) < len(nums) - 1):      
        y = nums.index(i)
        nums.pop(y)
        nums.pop(y) + 1              
return sum(nums)     




sum13([13, 1, 2, 13, 2, 1, 13]) → 3               3 OK       
sum13([]) → 0                                     0 OK       
sum13([13]) → 0                                   0 OK       
sum13([13, 13]) → 0                               0 OK       
sum13([13, 0, 13]) → 0                  FAILED    13 X       
sum13([13, 1, 13]) → 0                  FAILED    13 X      
sum13([5, 7, 2]) → 14                             14 OK       
sum13([5, 13, 2]) → 5                             5 OK       
sum13([0]) → 0                                    0 OK       
sum13([13, 0]) → 0                                0 OK       
other tests                                       OK     
def sum13(nums):
对于nums中的i:
如果i==13且(nums.index(i)>len(nums)-2:
nums.pop(nums.index(i))
继续
如果i==13且(nums.索引(i)
解决方案2

def sum13(nums):
    for i in nums: 
      if i == 13 and (nums.index(i) > len(nums) - 2):
        nums.pop(nums.index(i))
        continue       
      if i == 13 and (nums.index(i) < len(nums) - 1):      
        y = nums.index(i)
        nums.pop(y)
        nums.pop(y) + 1     
      if i == 13 and len(nums) <= 1:
        return 0
    return sum(nums)


sum13([13, 1, 2, 13, 2, 1, 13]) → 3                3 OK       
sum13([]) → 0                                      0 OK       
sum13([13]) → 0                                    0 OK       
sum13([13, 13]) → 0                                0 OK       
sum13([13, 0, 13]) → 0                             0 OK       
sum13([13, 1, 13]) → 0                             0 OK       
sum13([5, 7, 2]) → 14                             14 OK       
sum13([5, 13, 2]) → 5                      FAILED  0 X       
sum13([0]) → 0                                     0 OK       
sum13([13, 0]) → 0                                 0 OK       
other tests                                FAILED    X 
def sum13(nums):
对于nums中的i:
如果i==13且(nums.index(i)>len(nums)-2:
nums.pop(nums.index(i))
继续
如果i==13且(nums.索引(i)如果i==13且len(nums)看起来您在第二个if中实际执行nums.pop(y+1),但是除了这个错误,它无论如何都不会工作,因为您刚刚从数组中弹出了一个值,所以您的索引值已经更改。

我同意其他人的看法。您不希望在遍历列表时对其进行修改

这是我为你的问题写的一个简单的解决方案

def sum13(nums):
    # start unlucky_index  at a big number so it can never practically happen
    # at the beginning
    unlucky_index = 0xFFFF 
    sum = 0

    for i, num in enumerate(nums):

        # if num is 13 save index of that 13
        if num == 13:
            unlucky_index = i
            continue
        # if this is the next number after the 13 index
        # then ignore
        if i == unlucky_index + 1:
            continue

        sum += num

    print "sum =",sum # debug only

    return sum

倾听评论-在遍历列表时不要从列表中删除对象,除非你知道自己在做什么

我已经写了另一个代码,这是多一点。看一看,看看你是否能以某种方式使用它

def sum13(nums):
    running_total = 0
    # Make an iterator of the provided numbers. This enables us to call
    # next on it, even inside the for loop.
    inums = iter(nums)
    for n in inums:

        # Drop this number, and drop next number in the sequence.
        if n == 13:
            try:
                next(inums)    
            # If StopIteration is raised, it means that the current item
            # was the last in the iterator - break out of the loop
            except StopIteration:
                break
            continue

        # If not 13, add the current number to the running total
        else:
            running_total += n
    return running_total

迭代列表时不要从列表中删除项目。将
print nums
添加到循环体的开头,它将准确地清除正在发生的事情。+1用于向我们展示您的尝试和输入/输出示例。