Python 输出应该是数组中的数字之和,但不包括13和后面的数字

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

问题

返回数组中数字的总和,空数组返回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 (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 ))