跳过List Python中的元素

Ter*_*how 9 python

我是编程的新手,我正在尝试编写codingbat.com问题.我遇到了这个问题:

给定一个数组计算总和,除非数组中有13.如果数组中有13,则跳过13和紧随其后的数字.例如[1,2,13,5,1]应该产生4(因为跳过了13和5).

这就是我到目前为止所拥有的.我的问题是,当有多个13时,我不知道该怎么做......而且我想学习有效的编码.你们能帮忙吗?(我正在使用python 3.2)谢谢!

def pos(nums):
    for i in nums:
        if i == 13:
            return nums.index(13)
    return False

def sum13(lis):
    if pos(lis)!= False:
        return sum(lis[:pos(lis)])+sum(lis[pos(lis)+1:])
    else:
        return sum(lis)
Run Code Online (Sandbox Code Playgroud)

xva*_*tar 9

需要注意的一件事是:[1,13,13,2,3]

您需要跳过2

def getSum(l):
    sum = 0
    skip = False
    for i in l:
         if i == 13:
             skip = True
             continue
         if skip:
             skip = False
             continue
         sum += i
    return sum
Run Code Online (Sandbox Code Playgroud)

说明:

您逐个浏览列表中的项目

每次你

  • 首先检查它是否为13,如果是,则标记skipTrue,这样您也可以跳过下一项.
  • 其次,你是否skipTrue,如果是这样,这意味着它是一个项目13之后,所以你需要跳过这一个了,你还需要设置skipFalse,让你不要跳过下一个项目.
  • 最后,如果不是上面的任何一种情况,你可以添加值 sum


Ore*_*ren 5

您可以使用zip函数成对循环值:

def special_sum(numbers):
    s = 0
    for (prev, current) in zip([None] + numbers[:-1], numbers):
        if prev != 13 and current != 13:
            s += current
    return s
Run Code Online (Sandbox Code Playgroud)

或者你可以做一个oneliner:

def special_sum(numbers):
    return sum(current for (prev, current) in zip([None] + numbers[:-1], numbers)
               if prev != 13 and current != 13)
Run Code Online (Sandbox Code Playgroud)

您还可以使用迭代器:

from itertools import izip, chain
def special_sum(numbers):
    return sum(current for (prev, current) in izip(chain([None], numbers), numbers)
               if prev != 13 and current != 13)
Run Code Online (Sandbox Code Playgroud)

(izip中的第一个列表比第二个列表长,zipizip忽略了额外的值).