我正在尝试编写一个函数,它接受一个列表并对列表中的所有数字求和,除了它忽略列表中以列表开头并扩展到7的部分,但在7之后继续求和。是我的代码:
def sum67(nums):
i = 0
sum = 0
while i < len(nums):
k = 0
if nums[i] != 0:
sum += nums[i]
i += 1
if nums[i] == 6:
for j in range(i + 1, len(nums)):
if nums[j] != 7:
k += 1
if nums[j] == 7:
k += 2
i += k
测试用例显示6和7之前的前导数字被忽略,而其他数字被加到总和中,7之后的数字也被加到总和中(按照预期),但由于某种原因任何7在6之后的第7个之后没有总结 - 这不是我想要的,我不确定为什么会发生这种情况。有什么建议吗?
测试用例结果:
[1, 2, 2 Expected: 5. My result: 5 (OK)
[1, 2, 2, 6, 99, 99, 7] Expected: 5. My result: 5 (OK)
[1, 1, 6, 7, 2] Expected: 4 My result: 4 (Chill)
[1, 6, 2, 2, 7, 1, 6, 99, 99, 7] Expected: 2 My result: 1 (Not chill)
[1, 6, 2, 6, 2, 7, 1, 6, 99, 99, 7] Expected: 2 My result: 1 (Not chill)
[2, 7, 6, 2, 6, 7, 2, 7] Expected: 18 My result: 9 (Not chill)
`
答案 0 :(得分:1)
def sum67(nums):
# flag to know if we are summing
active = True
tot = 0
for n in nums:
# if we hit a 6 -> deactivate summing
if n == 6:
active = False
if active:
tot += n
# if we hit a seven -> reactivate summing
if n == 7 and not active:
active = True
return tot
答案 1 :(得分:0)
发布的代码完全被破坏了。
例如,对于没有任何6的列表,
当达到最后一个元素的i
条件时,nums[i] == 6
将超出列表范围。
您需要完全重新考虑循环内的条件。
这是一种有效的方法。
如果当前的数字是6,
然后跳过,直到看到7,而不添加总和。
否则加上总和。
执行这两个操作中的任何一个(跳过数字或添加总和)后,
增加i
。
def sum67(nums):
i = 0
total = 0
while i < len(nums):
if nums[i] == 6:
for i in range(i + 1, len(nums)):
if nums[i] == 7:
break
else:
total += nums[i]
i += 1
return total
答案 2 :(得分:0)
这是学习新Python技术的中间选择:
import itertools as it
def span_sum(iterable, start=6, end=7):
"""Return the sum of values found between start and end integers."""
iterable = iter(iterable)
flag = [True]
result = []
while flag:
result.extend(list(it.takewhile(lambda x: x!=start, iterable)))
flag = list(it.dropwhile(lambda x: x!=end, iterable))
iterable = iter(flag)
next(iterable, [])
return sum(result)
# Tests
f = span_sum
assert f([1, 2, 2]) == 5
assert f([1, 2, 2, 6, 99, 99, 7] ) == 5
assert f([1, 6, 2, 2, 7, 1, 6, 99, 99, 7]) == 2
assert f([1, 6, 2, 6, 2, 7, 1, 6, 99, 99, 7]) == 2
assert f([2, 7, 6, 2, 6, 7, 2, 7]) == 18
原则上,此函数会过滤输入,将值收集到满足您条件的result
并删除其余值,然后返回总和。特别是您可以观察以下技术:
itertools.takewhile
,itertools.dropwhile
next()
功能和默认值sum()
功能