跳过List Python中的元素

时间:2012-06-16 00:58:18

标签: 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)

7 个答案:

答案 0 :(得分:8)

需要注意的一件事是:[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,这样您也可以跳过下一项。
  • 其次,检查skipTrue,如果是,这意味着它是13之后的项目,所以你也需要跳过这一项,你还需要设置{{ 1}}返回skip,这样就不会跳过下一个项目。
  • 最后,如果不是上述任何一种情况,请将值添加到False

答案 1 :(得分: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

或者你可以做一个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 忽略额外值。)

答案 2 :(得分: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

答案 3 :(得分:1)

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

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之后。额外的“或”条件是处理序列中的第一个项目(没有先前的项目)。

答案 4 :(得分:1)

一些FP风格:)

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

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

Oneliner:)

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

答案 5 :(得分:0)

您可以使用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)

答案 6 :(得分:0)

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

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