返回数组中数字的总和,除了忽略以6开头并延伸到下一个7的数字部分(每6个后跟至少7个)。返回0表示没有数字。
sum67([1, 2, 2]) ? 5 sum67([1, 2, 2, 6, 99, 99, 7]) ? 5 sum67([1, 1, 6, 7, 2]) ? 4
def sum67(nums):
dontadd = 0
sum = 0
for i in range(0, len(nums)):
if dontadd == 0:
if nums[i] == 6:
dontadd = 1
else:
sum += nums[i]
else:
if nums[i] == 7:
dontadd = 0
else:
pass# nothing happens. It is useful as a placeholder when a statement is required syntactically
return sum
从codingbat寻找更优雅的解决方案。这个答案看起来并不像它可能是直观的
答案 0 :(得分:6)
如果我们可以删除我们不想要的元素,那么我们可以使用一个简单的总和。这是一个例子:
def sum67(nums):
nums=nums[:]
while 6 in nums:
i=nums.index(6)
j=nums.index(7,i)
del nums[i:j+1]
return sum(nums)
首先,我们使用nums=nums[:]
制作副本。调用者可能不希望nums
改变。
nums.index(6)
查找值为6的第一个元素的索引。nums.index(7,i)
查找索引i
之后值为7的第一个元素的索引。 del nums[i:j+1]
然后会删除i
到j
范围内的元素,包括j
处的元素。
答案 1 :(得分:3)
这不是太糟糕(你可能会说它试图过于聪明)。
>>> def sum67(nums):
... while 6 in nums:
... index = nums.index(6)
... while nums.pop(index) != 7:
... pass
... return sum(nums)
...
>>> sum67([1, 2, 3])
6
>>> sum67([1, 2, 2, 6, 99, 99, 7])
5
>>> sum67([1, 1, 6, 7, 2])
4
>>> sum67([1, 2, 2, 6, 99, 99, 7, 8, 1, 6, 0, -1000, 7, 2])
16
这是一个非常愚蠢的(不适用于负数)
>>> import re
>>> def sum67(nums):
... return sum(int(j) for j in re.sub(r'6\d*?7', '', ''.join((str(i) for i in nums))))
>>> sum67([1, 2, 3])
6
>>> sum67([1, 2, 2, 6, 99, 99, 7])
5
>>> sum67([1, 2, 2, 6, 99, 99, 7, 8, 1, 6, 0, 7, 2])
16
请不要写这样的代码:p
在我独自离开之前,还有一个可怕的内衬:
>>> def sum67(nums):
... return sum(i if i != 6 else -sum(nums[pos+1:nums.index(7,pos)+1]) for pos, i in enumerate(nums))
...
>>> sum67([1, 2, 2, 6, 99, 99, 7])
5
>>> sum67([1, 2, 2, 6, 99, 99, 7, 8, 1, 6, 0, -1000, 7, 2])
16
答案 2 :(得分:3)
我最喜欢Python的是,它可以轻松地解决问题。
def skip67(seq):
skipping = False
for value in seq:
skipping = skipping or value == 6
yield 0 if skipping else value
skipping = skipping and value != 7
def sum67(seq):
return sum(skip67(seq))
>>> sum67([1, 2, 2])
5
>>> sum67([1, 2, 2, 6, 99, 99, 7])
5
>>> sum67([1, 1, 6, 7, 2])
4
答案 3 :(得分:2)
def sum67(nums):
i=0
sum=0
n=len(nums)
while i<n:
if nums[i]==6:
i=nums.index(7,i)
else:
sum += nums[i]
i+=1
return sum
答案 4 :(得分:1)
此版本不会修改列表。
def sum67(xs):
xs = iter(xs)
s = 0
for x in xs:
if x == 6:
while x != 7:
x = xs.next()
else:
s += x
return s
答案 5 :(得分:1)
我的解决方案与OP没有太大差别,但总的来说我喜欢总是在那里进行添加操作并且只需要逻辑来将“accum”的值切换为1到0之间的想法。
def sum67(nbrs):
total = 0
accum = 1
for nbr in nbrs:
if nbr==6:
accum=0
total += nbr*accum
if accum==0 and nbr==7:
accum=1
return total
答案 6 :(得分:1)
def sum67(L):
it = iter(L)
return sum(all(i!=7 for i in it) if i == 6 else i for i in it)
如果您对其工作方式感兴趣,可以使用稍微更易读的版本:
def slice67(L):
it = iter(L)
for i in it:
if i != 6:
yield i
else:
while next(it, 7) != 7:
pass
print sum(slice67([1, 2, 2]))
答案 7 :(得分:0)
这是一个可能更容易理解的版本:
def sum67(nums):
found6 = False
result = 0
for n in nums:
if n==6:
found6 = True
continue
if n==7 and found6:
found6 = False
continue
if not found6:
result += n
return result
答案 8 :(得分:0)
这个怎么样?
>>> def sum67(l):
... sum = 0
... add = True
... for i in l:
... add = add and (i != 6)
... sum += add and i or 0
... add = add or i == 7
... return sum
...
>>> print sum67([1, 2, 3])
6
>>> print sum67([1, 2, 2, 6, 99, 99, 7])
5
>>> print sum67([1, 1, 6, 7, 2])
4
>>> print sum67([1, 2, 2, 6, 99, 99, 7, 8, 1, 6, 0, -1000, 7, 2])
16
它利用了以下事实:Python将布尔表达式计算为确定结果的第一个操作数的值,例如,在sum += add and i or 0
中,如果add
是False
,则进入or
部分并评估为0
,如果add
为True
,则评估为i
。
答案 9 :(得分:0)
def sum67(nums):
while 6 in nums:
for x in nums[nums.index(6):]:
nums.remove(x)
if x == 7:
break
return sum(nums)
答案 10 :(得分:0)
列表理解的单行:
def sum67(nums):
return sum([x for index, x in enumerate(nums) if (((nums[(index - nums[index::-1].index(6)):].index(7) + (index - nums[index::-1].index(6))) < index) if (6 in nums[:index+1]) else True)])