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