跳过Python列表中的元素

跳过Python列表中的元素,python,Python,我是编程新手,我正试图从codingbat.com的问题开始。我遇到了这个问题: 给定一个数组,除非数组中有13,否则计算总和。如果数组中有13,请跳过13和紧跟其后的数字。例如[1,2,13,5,1]应该产生4(因为13和5被跳过) 这就是我目前所拥有的。我的问题是,当有多个13时,我不知道该怎么办…我想学习有效的编码。你们能帮忙吗?(我正在使用python 3.2)谢谢 使用while循环遍历列表,手动递增i。在每次迭代中,如果遇到13,则增量i两次;否则,将该值添加到运行总和中,并递增i一

我是编程新手,我正试图从codingbat.com的问题开始。我遇到了这个问题:

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

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


使用while循环遍历列表,手动递增
i
。在每次迭代中,如果遇到13,则增量
i
两次;否则,将该值添加到运行总和中,并递增
i
一次

def skip13s(l):
    i = 0
    s = 0
    while (i < len(l)):
        if l[i] == 13:
            i += 1
        else:
            s += l[i]
        i += 1
    return s
def SKIP13(l):
i=0
s=0
而(i
您可以使用
while
循环来处理多个
13

def sum13(lis):
    while pos(lis):
        if pos(lis) == len(lis) - 1:
            lis = lis[:pos(lis)]
        else:
            lis = lis[:pos(lis)]+lis[pos(lis)+1:]

    return sum(lis)

需要注意的一件棘手的事情是这样的:[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
说明

你一个接一个地浏览列表中的项目

每次你

  • 首先检查它是否为13,如果是,则将
    跳过
    标记为
    ,以便您也可以跳过下一项
  • 第二,检查
    skip
    是否为
    True
    ,如果是,这意味着它是13之后的一个项目,因此您也需要跳过这个项目,并且还需要将
    skip
    设置回
    False
    ,这样您就不会跳过下一个项目
  • 最后,如果不是上述任何一种情况,则将该值相加至
    sum
您可以使用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
或者,您也可以使用oneliner:

def special_sum(numbers):
    return sum(current for (prev, current) in zip([None] + numbers[:-1], numbers)
               if prev != 13 and current != 13)
您还可以使用迭代器:

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)

(izip中的第一个列表比第二个列表长,zip和izip忽略额外的值)。

我认为这是最紧凑的解决方案:

def triskaidekaphobicSum(sequence):
    return sum(sequence[i] for i in range(len(sequence))
               if sequence[i] != 13 and (i == 0 or sequence[i-1] != 13))
这在生成器表达式上使用内置的sum()函数。生成器生成序列中的所有元素,只要它们不是13,或紧跟在13之后。额外的“或”条件是处理序列中的第一项(没有前一项)。

某些FP样式:)

此代码适用于任何迭代器,即使它不提供随机访问(直接索引)-套接字(例如:)

一行:)

用法:

skipAndAddFun([1,2,13,5,1], [13, 5])
4

这个简单的函数将是您问题的通用解决方案。

您的示例应该会产生
4
,对吗?1+2+1=4。@事实上,我认为连续13秒的行为有点模棱两可。13应该跳过随后13的效果吗?假设13没有跳过连续13的效果,因此[13,13,1,4]产生4。
if foo!=错误:
是冗余的;只要使用
if foo:
你接受的答案在这里也适用:你能为我这样的新手解释一下这个迭代吗?啊,我不知道如果skip:implicated如果skip=True…谢谢!啊,我喜欢这个答案,我明白了!(zip功能现在对我来说太高级了)再次感谢
elif
在这里比
continue
更好。OP注意:这个答案也适用于这个问题:出于某种原因,它对[13,1,2,13,2,1,13]不起作用……它给出了45作为sum,我想这是因为列表中最新的元素是13。所以我编辑了我的代码。哇,谢谢!这一个看起来会起作用,经过长时间的观察,我现在明白了。谢谢这段代码的内存效率非常低,无法使用迭代器:)
def add_but_skip_13_and_next(acc, x):
    prev, sum_ = acc
    if prev != 13 and x != 13:
        sum_ += x
    return x, sum_

filter_and_sum = lambda l: reduce(add_but_skip_13_and_next, l, (0,0))[1]

>>> print filter_and_sum([13,13,1,4])
4
>>> print filter_and_sum([1,2,13,5,13,13,-9,13,13,13,13,13,1,1])
4
>>> filter_and_sum = lambda l: reduce(
...     lambda acc, x: (x, acc[1] + (x if x != 13 and acc[0] != 13 else 0)),
...     l, (0,0))[1]
>>> print filter_and_sum([1,2,13,5,13,13,-9,13,13,13,13,13,1,1])
4
def skipAndAddFun(inputVal, skipList):
   sum = 0
   for i in inputVal:
        if not i in skipList:
            sum += i
    return sum
skipAndAddFun([1,2,13,5,1], [13, 5])
4