我创建了一个for循环,用于计算列表的总和,但整数13和其后的整数除外。我的循环有效,但我不知道为什么,有人可以帮助解释吗?
我尝试打印循环的各个部分以了解其功能。它成功地从总和中删除了13个,但我不明白为什么2个也被跳过了。
nums = [5, 13, 2]
def sum13(nums):
i = 0
for elem in nums:
if elem != 13:
i = i + elem
else:
nums.remove(elem)
return i
答案 0 :(得分:1)
如果不是13
,则没有理由真正删除该值,您可以跳过它。
def sum13(nums):
i = 0
skip = False
for elem in nums:
if elem != 13 and not skip:
i = i + elem
else:
if skip:
skip = False # Stop skipping
else:
skip = True
return i
然后sum13([5, 13, 2, 1])
将返回6
。
答案 1 :(得分:1)
执行此操作的更好方法是使nums
为显式迭代器,并在找到{{1}时使用next
消耗其中的值(应跳过的下一个值)。 }}。
13
答案 2 :(得分:0)
您的代码“有效”是因为您缩短了列表,因此循环中从未“看到” 2。不要修改您迭代过的列表。
会发生什么情况:您遍历[5, 13, 2]
:
1st value is 5, 5 is not 13 so it is added
2nd value is 13 and not added, you delete 13 from your list - it becomes [5,2]
3rd value ... is no longer there, list is only 2 long, loop never looks at 2
这是一个常见的误解,请参见f.e.我两天前的answer。
您可以记住是否需要跳过数字:
def sum13(l):
skip=False
s = 0
for i in l:
if i==13:
skip = True
elif skip:
skip = False
else:
s += i
return s
print(sum13([5, 13, 2, 21])) # 26