我是编程的新手,我正在尝试编写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)
需要注意的一件事是:[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)
说明:
您逐个浏览列表中的项目
每次你
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
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中的第一个列表比第二个列表长,zip和izip忽略了额外的值).
| 归档时间: |
|
| 查看次数: |
38291 次 |
| 最近记录: |