首页 > 解决方案 > 取列表的总和,但将奇数元素更改为负数

问题描述

编写一个函数alternating_sign_sum(nums),它将一个可能为空的数字nums列表作为参数并返回结果

nums[0] - nums[1] + nums[2] - nums[3] ... 即所有数字的总和,但所有奇数元素取反。如果列表为空,则返回值应为零。您的函数不应修改作为参数传递的列表。

def alternating_sign_sum(nums):
    """yo"""    
    lis = 0
    for num in nums:
        if num & 1 == 1:
            num = num * -1
        if num % 2 == 0:
            num = num * 1
        
        lis += num
    return (lis)

标签: python

解决方案


与您类似的简单的逐元素方法将使用一个在一个和负一个之间交替的乘数,如下所示:

    def alternating_sign_sum(the_list):
        the_sum = 0
        the_mult = 1
        for item in the_list:
            the_sum = the_sum + the_mult * item
            the_mult = -the_mult
        return the_sum

然而,Pythonic的方法只是使用两个列表推导来完成,一个处理奇数元素索引,另一个处理偶数索引:

    def alternating_sign_sum(the_list):
        return sum(the_list[0::2]) - sum(the_list[1::2])

这是有效的,因为列表切片0::2意味着从元素零(第一个元素)开始,消耗所有元素,但仅每隔一个。所以这是第一,第三,第五,等等。同样,1::2表示第二个、第四个等等。

带有测试工具的最后一个版本如下:

def alternating_sign_sum(the_list):
    return sum(the_list[0::2]) - sum(the_list[1::2])

print(alternating_sign_sum([]))
print(alternating_sign_sum([7]))
print(alternating_sign_sum([7, 2]))
print(alternating_sign_sum([1, 2, 3, 4]))

并按预期产生:

0
7
5
-2

推荐阅读