Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 编写函数sum13(nums)_Python - Fatal编程技术网

Python 编写函数sum13(nums)

Python 编写函数sum13(nums),python,Python,编写一个函数sum13(nums),该函数接受整数nums列表并返回列表中的数字之和,空列表返回0。除此之外,数字13是非常不吉利的,所以它不算数,紧跟在13之后的数字也不算数 Test Result print(sum13([1, 2, 2, 1, 13])) 6 print(sum13([13, 2, 2, 1])) 3 print(sum13([13, 13, 2, 13, 1, 5, 6, 13])) 11(EXPECTED) 13(GOT) 这是我的程序,我不知道为什么最后的测

编写一个函数sum13(nums),该函数接受整数nums列表并返回列表中的数字之和,空列表返回0。除此之外,数字13是非常不吉利的,所以它不算数,紧跟在13之后的数字也不算数

Test    Result
print(sum13([1, 2, 2, 1, 13]))
6
print(sum13([13, 2, 2, 1]))
3
print(sum13([13, 13, 2, 13, 1, 5, 6, 13]))
11(EXPECTED)
13(GOT)
这是我的程序,我不知道为什么最后的测试代码没有运行

def sum13(nums):
    """jdhdjkls"""
    if len(nums) == 0:
        return 0

    for i in range(0, len(nums)):
        if nums[i] == 13:
            nums[i] = 0
            if i+1 < len(nums): 
                nums[i+1] = 0
    return sum(nums)
def sum13(nums):
“jdhdjkls”
如果len(nums)==0:
返回0
对于范围(0,len(nums))内的i:
如果nums[i]==13:
nums[i]=0
如果i+1
这将解决您的问题:

def sum13(nums):
    """jdhdjkls"""
    if len(nums) == 0:
        return 0

    for i in range(0, len(nums)):
        if nums[i] == 13:
            nums[i] = 0
            # problem arises when there are 2 consecutive 13 this if statement will rectify it.
            if (i+1 < len(nums)) and (nums[i+1]!=13): 
                nums[i+1] = 0
    return sum(nums)
def sum13(nums):
“jdhdjkls”
如果len(nums)==0:
返回0
对于范围(0,len(nums))内的i:
如果nums[i]==13:
nums[i]=0
#当有2个连续的13个if语句将对其进行纠正时,就会出现问题。
如果(i+1
您可以使用内置方法压缩两个倾斜的列表,如下所示:

[1, 2, 3, 4]
[1, 2, 3, 4]

并检查其中是否有
13

以下是方法:

def sum13(nums):
    s = 0 if nums[0] == 13 else nums[0]
    for p in zip(nums, nums[1:]):
        if all(n != 13 for n in p):
            s += p[1]
    return s

print(sum13([1, 2, 2, 1, 13]))
print(sum13([13, 2, 2, 1]))
print(sum13([13, 13, 2, 13, 1, 5, 6, 13]))
def sum13(nums):
    s = 0 if nums[0] == 13 else nums[0]
    for i, j in zip(nums, nums[1:]):
        if i != 13 != j:
            s += j
    return s

print(sum13([1, 2, 2, 1, 13]))
print(sum13([13, 2, 2, 1]))
print(sum13([13, 13, 2, 13, 1, 5, 6, 13]))
输出:

6
3
11
您还可以解包这些对:

def sum13(nums):
    s = 0 if nums[0] == 13 else nums[0]
    for p in zip(nums, nums[1:]):
        if all(n != 13 for n in p):
            s += p[1]
    return s

print(sum13([1, 2, 2, 1, 13]))
print(sum13([13, 2, 2, 1]))
print(sum13([13, 13, 2, 13, 1, 5, 6, 13]))
def sum13(nums):
    s = 0 if nums[0] == 13 else nums[0]
    for i, j in zip(nums, nums[1:]):
        if i != 13 != j:
            s += j
    return s

print(sum13([1, 2, 2, 1, 13]))
print(sum13([13, 2, 2, 1]))
print(sum13([13, 13, 2, 13, 1, 5, 6, 13]))

您的脚本无法对应于
13 13 2
,因为它们是在第一步中生成的
0 0 2

对于
继续
对您的目标有效

def sum13(nums):
    sums=0
    after13=False
    for num in nums:
        if num == 13:
            after13=True
            continue
        if not after13:
            sums+=num
        after13=False
    return sums
我们可以尝试使用递归来解决此问题:

def sum13(numbers):
    if not numbers:  # base case
        return 0

    first, *rest = numbers

    if first == 13:
        first = 0

        if rest and rest[0] != 13:
            rest.pop(0)

    return first + sum13(rest)

print(sum13([1, 2, 2, 1, 13]))
print(sum13([13, 2, 2, 1]))
print(sum13([13, 13, 2, 13, 1, 5, 6, 13]))
虽然不是您可能想要的回答方式,但我们也可以强制
itertools.groupby
为我们完成以下工作:

from itertools import groupby

def sum13(numbers):
    previous13 = False

    def is_tainted(number):
        nonlocal previous13

        tainted = previous13
        previous13 = number == 13

        return True if tainted else previous13

    total = 0

    for tainted, subset in groupby(numbers, is_tainted):
        if not tainted:
            total += sum(subset)

    return total

欢迎来到堆栈溢出!请阅读。您还可以使用它来帮助逐步可视化代码的执行。如果一行中有两个13,会发生什么情况?好的,每当您看到一个13,您就将其设置为零,并且立即将下面的数字设置为零-即使下面的数字是另一个13。因此,2不会被调零,因为它跟随的是0,而不是13,当您检查第二个元素时。对于
[13,2,2,1]
返回5,而不是OP规则所暗示的3。其他示例也一样。由于键入了
num
vs.
nums
。否则可以。第一次看到非本地!我会查的。我喜欢创造性的方法!;)第一个代码中有一个输入错误,你的意思是
如果rest和rest[0]==13:
-或者你可以直接删除整个
如果
块,那么
rest
中的任何13都将由下一个递归调用处理。第二个版本中有一个问题:
sum13([13,13,3,3])
返回
3
…@thierrylahuille,我在第一个示例中没有输入错误,这就是它的工作方式。至于第二个例子,3是正确的答案,正如说明所暗示的,并且所有其他张贴的答案返回。我看不出你的例子有什么不同。