我怎样才能比我的功能更好?
def sum13(nums):
total = 0
wheresNumAfter13 = nums.index(13) + 1
numAfter13Value = nums[wheresNumAfter13]
for num in nums:
if num != 13:
total += num
return total - numAfter13Value
print(sum13([1,2,3,4,5,13,4]))
答案 0 :(得分:3)
您可以执行相关切片的总和,类似于您正在执行的操作,查找索引13,然后对列表中的部分以及之后的下一个元素进行求和。< / p>
您还可以在结合两个部分的结果列表中使用内置sum
函数:
def sum13(nums):
wheres13 = nums.index(13)
return sum(nums[0:wheres13]+nums[wheres13+2:])
请注意,与您的解决方案一样,此解决方案仅适用于您只在列表中排除13的情况。
如果列表不包含13,它们也会失败。
解释,对于示例列表,例如:[1,2,3,4,5,13,4,10]
:
wheres13 = nums.index(13)
nums[0:wheres13]
。这会产生类似[1,2,3,4,5]
的列表,即从索引0到索引wheres13
(不包括它)。 nums[wheres13+2:]
。这会生成一个类似[10]
的列表,即从13之后的数字索引(索引wheres13
加2)到列表末尾。nums[0:wheres13]+nums[wheres13+2:]
。这会生成一个类似[1,2,3,4,5,10]
sum
函数为了完整性,修改了一个版本以删除每个 13和下一个号码:
def sum13(nums):
n=nums
while 13 in n:
wheres13 = n.index(13)
n = n[0:wheres13]+n[wheres13+2:]
return sum(n)
答案 1 :(得分:2)
我很想把它写成一个简单的生成器理解。即使有多个13s实例,这也有效:
>>> x = [1,1,1,13,99,1,1,13,99,1,13,13,13,1]
>>> sum(cur for cur,prev in zip(x, [None]+x) if 13 not in (cur,prev))
6
阅读:总结cur
或之前的数字不是13的所有数字cur
。
但是,将它作为生成器函数编写更具可读性:
def exclude_13s(x):
for cur,prev in zip(x, [None]+x):
if 13 not in (cur,prev):
yield cur
那样
>>> sum(exclude_13s(x))
6
答案 2 :(得分:1)
def sum13(nums):
if 13 in nums:
index13 = nums.index(13)
del nums[index13:index13 + 2]
return sum13(nums)
else:
return sum(nums)
print(sum13([1,2,3,4,5,13,4]))
答案 3 :(得分:1)
您也可以尝试这种方式:
def The13(l):
size = len(l)
bucket = [y for x in range(size) for y in range(x,x+2) if(l[x]==13)]
return sum([l[x] for x in range(size) if x not in bucket])
bucket包含13个元素的所有索引及其后面的数字
答案 4 :(得分:0)
您可以执行此操作,而无需使用list.index
或担心13
是否存在:
from itertools import takewhile, islice
def sum13(iterable):
it = iter(iterable)
return sum(takewhile(lambda L: L != 13, it)) + sum(islice(it, 1, None))
这将总结直到但不包括13,然后从迭代中恢复求和,忽略13之后的数字。