我正在尝试编写一个迭代列表的函数,以返回列表中整数元素的总和。但是如果列表中有一个13,那么它需要排除13和其后的总和。到目前为止,我已经提出了以下代码。这适用于几乎所有情况,除非有两个13背靠背。它只排除了两个13而不是两个13&s以及在第二个13之后的任何内容。例如,当我用print(sum13([13, 13, 2, 13, 1, 5, 6, 13]))
调用函数时,而不是给出{{的输出1}}它给出了11
。任何帮助表示赞赏。
13
答案 0 :(得分:1)
执行此类操作的惯用方法是跟踪上一个变量,例如:
def sum13(nums):
prev = None
my_sum = 0
for ele in nums:
if ele != 13 and prev != 13:
my_sum += ele
prev = ele
return my_sum
if __name__ == "__main__":
print(sum13([1,2,13,3,4]))
print(sum13([13, 13, 2, 13, 1, 5, 6, 13]))
结果:
7
11
答案 1 :(得分:1)
你可以在功能上做到:
def sum13(nums):
return sum(current
for current, following
in zip(nums, [None] + nums[:-1])
if current != 13 and following != 13)
" Gimme是所有不是13的数字的总和,其下一个数字不是13"。
答案 2 :(得分:0)
您可以使用切片来确定13是否在数字之前:
max
i-1
仅对第一个元素是必需的,因为0-1
将为[-1:1]
,因此切片为sum(e for i, e in enumerate(nums) if 13 not in nums[max(i-1, 0):i+1])
,为空。如果你真的想要,你甚至可以将它减少到一行:
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
---
<spring:eval var="containsValue" expression="T(org.apache.commons.lang3.ArrayUtils).contains(yourArray, 'expectedElement')" />
Contains (true or false): ${containsValue}
答案 3 :(得分:0)
因为发电机也需要爱:
l = [13, 13, 2, 13, 1, 5, 6, 13]
def sanitize(list):
il = iter(list)
for e in il:
while e == 13:
e = next(il)
if e != 13:
e = next(il)
yield e
print(sum(sanitize(l)))
这个想法是先清理你的清单,然后总结一下。
答案 4 :(得分:0)
尝试以下方法。请注意,这是使用nexted函数删除13s,或一系列13s和
之后的数字def refine(nums, index_i):
while 13 in nums:
print(nums)
index = len(nums) - nums[::-1].index(13) - 1
if index == index_i -1:
nums = refine(nums[0:index] + nums[index+1:], index)
else:
nums = refine(nums[0:index] + nums[index+2:], index)
return nums
print( sum(refine([0, 13, 1, 2, 3, 4, 13, 13, 7, 13, 13, 5, 6, 13], 0)) )
这只会加总[0, 2, 3, 4, 6]
但是,假设您有一个小列表要管理大型列表,您可能想要考虑这种操作的性能