簡體   English   中英

跳過List Python中的元素

[英]Skipping elements in a List 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)

需要注意的一件事是:[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之后,所以你需要跳過這一個了,你還需要設置skipFalse ,讓你不要跳過下一個項目。
  • 最后,如果不是上面的任何一種情況,你可以將值加到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中的第一個列表比第二個列表長, zipizip忽略了額外的值)。

使用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 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式:)

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

此代碼適用於任何迭代器,即使它不提供隨機訪問(直接索引) - 例如套接字:)

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

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

這個簡單的函數將是您的問題的通用解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM