Python 输出应该是数组中的数字之和,但不包括13和后面的数字
问题 返回数组中数字的总和,空数组返回0。除此之外,数字13是非常不吉利的,所以它不算数,紧跟在13之后的数字也不算数 这是编码bat的一个问题 我的代码**:**Python 输出应该是数组中的数字之和,但不包括13和后面的数字,python,Python,问题 返回数组中数字的总和,空数组返回0。除此之外,数字13是非常不吉利的,所以它不算数,紧跟在13之后的数字也不算数 这是编码bat的一个问题 我的代码**:** def sum13(nums): nums.append(0) nums = [0 if nums[nums.index(x)-1] == 13 else x for x in nums] nums = [0 if x == 13 else x for x in nums] return (s
def sum13(nums):
nums.append(0)
nums = [0 if nums[nums.index(x)-1] == 13 else x for x in nums]
nums = [0 if x == 13 else x for x in nums]
return (sum(nums))
失败的地方:
sum13[1,2,13,2,1,13]应该将输出设置为4,但我的代码输出为6
sum13[13,1,2,13,2,1,13]应该将输出设为3,但我的代码将输出4
请帮帮我。给你:
def sum13(nums):
总数=0
i=0
而我
易于理解:
def sum13(nums):
result = 0
nums.insert(0,0)
for i in range(len(nums)):
if nums[i] != 13 and nums[i-1] != 13:
result += nums[i]
return result
l = sum13([13, 1, 2, 13, 2, 1, 13])
print(l)
输出:
3
list.index()
不是在列表理解中跟踪索引的可靠方法
这可以通过“展望未来”(或“展望过去”,取决于视角)来解决,而不是依赖索引,直接访问理解中的列表。我们可以通过使用
定义f(nums):
... 如果a!=13和b!=13,则返回[b表示a,b在zip中(nums,nums[1:])
...
>>>f([0,1,2,13,2,1,13])
[1, 2, 1]
>>>f([0,13,1,2,13,2,1,13])
[2, 1]
上面的理解创建了前一(a
)和当前(b
)值对,如果前一个值和当前值都不是13,则包括当前值
因此,解决方案
def sum13(nums):
nums = [0] + nums
return sum(( b for a, b in zip(nums, nums[1:]) if a != 13 and b != 13 ))
注意,为了提高效率,我将列表语法[…]
替换为生成器语法(…)
解决这个问题的另一种方法(使用列表理解)是使用
第一个解决方案更漂亮,因为所有必要的信息都包含在
zip
iterable中,而在第二个解决方案中,我们需要访问enumerate
iterable之外的信息(即nums[i-1]
)。您确实意识到使用nums.index(x)
如果列表中有重复的值,会导致问题。。。?
def sum13(nums):
nums = [0] + nums
return sum(( x for i, x in enumerate(nums) if i > 0 and nums[i-1] != 13 and x != 13 ))