在python列表中求和整数,但不包括数字13和它后面的数字

时间:2014-12-14 03:55:35

标签: python list function sum

我怎样才能比我的功能更好?

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]))

5 个答案:

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

  • 寻找13:wheres13 = nums.index(13)
  • 在索引13之前获取列表的一部分:nums[0:wheres13]。这会产生类似[1,2,3,4,5]的列表,即从索引0到索引wheres13(不包括它)。
  • 在13之后获取列表的一部分:nums[wheres13+2:]。这会生成一个类似[10]的列表,即从13之后的数字索引(索引wheres13加2)到列表末尾。
  • 加入两个列表:nums[0:wheres13]+nums[wheres13+2:]。这会生成一个类似[1,2,3,4,5,10]
  • 的列表
  • 在上一点的列表中使用python的内置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之后的数字。