在列表中添加除特定数字和以下数字之外的数字

时间:2016-08-24 20:51:36

标签: python

我是编程的新手,我正在尝试将给定列表中的所有数字加起来,除了数字13和数字13之后的任何数字。我遇到的问题是如果13结尾了列表中不会添加第一个数字。任何帮助,将不胜感激。我的代码如下:

def sum13(nums):
    total = 0
    for i in range(len(nums)):
        if nums[i] == 13 or nums[i-1] == 13:
            total += 0
        else:
            total += nums[i]

    return total

def main():
    print sum13([1, 2, 2, 1, 13])
    print sum13([1, 2, 13, 2, 1, 13])
main()

这两个例子应该产生6和4,但是它会产生5和3,因为它不会在开头添加1。

2 个答案:

答案 0 :(得分:2)

在Python中,索引-1表示列表中的最后一项。因此,在您的代码中,当i0(第一个数字)时,它将不会计算,因为列表中的最后一项是13

您可以通过在该条件下i > 1进行简单检查来解决此问题:

if nums[i] == 13 or (i > 0 and nums[i - 1] == 13):

另外,对于它的价值,因为我们都喜欢单行,这里有一个等同的功能:

return sum(num for i, num in enumerate(nums) if num != 13 and (i == 0 or nums[i - 1] != 13))

答案 1 :(得分:0)

我的主张:

def sum13(numbers):
    total = 0
    skip = False
    for i, number in enumerate(numbers):
        if number == 13:
            skip = True
            continue
        if skip:
            skip = False
            continue
        total += number

    return total


def test():
    cases = [
        ([13, 1, 1], 1),
        ([13, 1, 5, 13], 5),
        ([1, 13, 5, 1], 2),
        ([1, 2, 2, 1, 13], 6),
        ([1, 2, 13, 2, 1, 13], 4),
    ]
    for case in cases:
        assert sum13(case[0]) == case[1]


test()

了解枚举是否适用于您: https://docs.python.org/3.4/library/functions.html#enumerate