Python循环计算列表中除13之外的元素总和

时间:2017-09-14 03:46:20

标签: python list loops sum

我正在尝试编写一个迭代列表的函数,以返回列表中整数元素的总和。但是如果列表中有一个13,那么它需要排除13和其后的总和。到目前为止,我已经提出了以下代码。这适用于几乎所有情况,除非有两个13背靠背。它只排除了两个13而不是两个13&s以及在第二个13之后的任何内容。例如,当我用print(sum13([13, 13, 2, 13, 1, 5, 6, 13]))调用函数时,而不是给出{{的输出1}}它给出了11。任何帮助表示赞赏。

13

5 个答案:

答案 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]

但是,假设您有一个小列表要管理大型列表,您可能想要考虑这种操作的性能