我是编程新手,我正在尝试编写codingbat.com问题。我遇到了这个问题:
给定一个数组计算总和,除非数组中有13。如果数组中有13,则跳过13和紧随其后的数字。例如[1,2,13,5,1]应该产生4(因为跳过了13和5)。
这是我到目前为止所拥有的。我的问题是,当有多个13时,我不知道该怎么做......而且我想学习有效的编码。你们能帮忙吗? (我使用的是python 3.2)谢谢!
def pos(nums):
for i in nums:
if i == 13:
return nums.index(13)
return False
def sum13(lis):
if pos(lis)!= False:
return sum(lis[:pos(lis)])+sum(lis[pos(lis)+1:])
else:
return sum(lis)
答案 0 :(得分:8)
需要注意的一件事是:[1,13,13,2,3]
您还需要跳过2
def getSum(l):
sum = 0
skip = False
for i in l:
if i == 13:
skip = True
continue
if skip:
skip = False
continue
sum += i
return sum
<强>解释强>:
您逐个查看列表中的项目
每次
skip
标记为True
,这样您也可以跳过下一项。skip
是True
,如果是,这意味着它是13之后的项目,所以你也需要跳过这一项,你还需要设置{{ 1}}返回skip
,这样就不会跳过下一个项目。False
答案 1 :(得分:5)
您可以使用 zip 函数成对循环值:
def special_sum(numbers):
s = 0
for (prev, current) in zip([None] + numbers[:-1], numbers):
if prev != 13 and current != 13:
s += current
return s
或者你可以做一个oneliner:
def special_sum(numbers):
return sum(current for (prev, current) in zip([None] + numbers[:-1], numbers)
if prev != 13 and current != 13)
您也可以使用迭代器:
from itertools import izip, chain
def special_sum(numbers):
return sum(current for (prev, current) in izip(chain([None], numbers), numbers)
if prev != 13 and current != 13)
( izip 中的第一个列表比第二个更长, zip 和 izip 忽略额外值。)
答案 2 :(得分:2)
使用while循环遍历列表,手动递增i
。在每次迭代中,如果遇到13,则递增i
两次;否则,将值添加到运行总和并增加i
一次。
def skip13s(l):
i = 0
s = 0
while (i < len(l)):
if l[i] == 13:
i += 1
else:
s += l[i]
i += 1
return s
答案 3 :(得分:1)
我认为这是最紧凑的解决方案:
def triskaidekaphobicSum(sequence):
return sum(sequence[i] for i in range(len(sequence))
if sequence[i] != 13 and (i == 0 or sequence[i-1] != 13))
这在生成器表达式上使用内置sum()函数。生成器生成序列中的所有元素,只要它们不是13,或紧跟在13之后。额外的“或”条件是处理序列中的第一个项目(没有先前的项目)。
答案 4 :(得分:1)
一些FP风格:)
def add_but_skip_13_and_next(acc, x):
prev, sum_ = acc
if prev != 13 and x != 13:
sum_ += x
return x, sum_
filter_and_sum = lambda l: reduce(add_but_skip_13_and_next, l, (0,0))[1]
>>> print filter_and_sum([13,13,1,4])
4
>>> print filter_and_sum([1,2,13,5,13,13,-9,13,13,13,13,13,1,1])
4
此代码适用于任何迭代器,即使它不提供随机访问(直接索引) - 例如socket:)
Oneliner:)
>>> filter_and_sum = lambda l: reduce(
... lambda acc, x: (x, acc[1] + (x if x != 13 and acc[0] != 13 else 0)),
... l, (0,0))[1]
>>> print filter_and_sum([1,2,13,5,13,13,-9,13,13,13,13,13,1,1])
4
答案 5 :(得分:0)
您可以使用while
循环来处理多个13
。
def sum13(lis):
while pos(lis):
if pos(lis) == len(lis) - 1:
lis = lis[:pos(lis)]
else:
lis = lis[:pos(lis)]+lis[pos(lis)+1:]
return sum(lis)
答案 6 :(得分:0)
def skipAndAddFun(inputVal, skipList):
sum = 0
for i in inputVal:
if not i in skipList:
sum += i
return sum
用法:
skipAndAddFun([1,2,13,5,1], [13, 5])
4
这个简单的功能将是您问题的通用解决方案。