[英]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
說明 :
您逐個瀏覽列表中的項目
每次你
skip
標記為True
,這樣您也可以跳過下一項。 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忽略了額外的值)。
使用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.