簡體   English   中英

在列表上交替加減

[英]Alternate between add and subtract on a list

這里有人知道如何對交替符號的列表中的元素求和嗎? 我試過這個:

i = 40
suma = 0
sign = 1

while i <= 100:
    suma = suma + sign * i
    sign = sign * -1
    i = i + 1
    
print(suma)

但我不知道如何將其改進為函數並添加列表。 請幫忙。

def add_alternate_sign(a_list):
    total = 0
    for i, number in enumerate(a_list):
        total += number * (-1) ** i

    print(total)


numbers = [1,2,3,4,5]
add_alternate_sign(numbers)

您可以使用numpy進行更快的矢量化操作。 使用您的示例:

import numpy as np

x = np.arange(1, 101)
np.sum(x*(-1)**x)

對於任意列表:

x = [5,10,20,100,2, 1]
y = np.array(x)
np.sum(y*(-1)**np.arange(len(x)))

您可以使用itertools.cycle連續循環1, -1為乘數。 例如:

import itertools

def alternate_sum(a):
    """
    sums elements of a list with alternating multiplier +1, -1, +1, -1, ...
    """
    return sum(x * s for x, s in zip(a, itertools.cycle([1, -1])))

print(alternate_sum([10,11,12,14,15]))

這種方法不僅限於 +1 和 -1 的特殊情況; 它可以用於任何乘數序列(任何長度)。

另一種解決方案:

def alternate_sum(a):
    """
    return sum of the elements of a with alternating multiplier 1, -1, ... 
    """
    return sum(x * (-1)**i for i, x in enumerate(a))

這里i是索引號 0, 1, 2, ...., 所以(-1)**i是序列 1, -1, 1, ...

您可以使用切片對列表中的替代條目求和:

def altsum(v):
    return sum(v[0::2]) - sum(v[1::2])

唯一的缺點是切片創建了兩個新列表,一個具有偶數索引,另一個具有奇數索引。 如果您的原始列表很大,則浪費了大量存儲空間(以及一些時間)。

因此,您可以使用itertools.islice來避免創建列表,盡管據我所知,由於islice未針對列表進行優化,因此不太可能會更快。

from itertools import islice
def altsum(v):
    return sum(islice(v, 0, None, 2)) - sum(islice(v, 1, None, 2))

但這不適用於任意迭代,因為它依賴於能夠迭代參數兩次。 要構造任意迭代的交替和,您可以使用itertools.zip_longest (或 Python 2 中的itertools.izip_longest )和functools.reduce (或 Python 2 中的reduce ):

from functools import reduce
from itertools import zip_longest

def altsum(v):
    it = iter(v)
    return reduce(lambda accum, pn: accum + pn[0] - pn[1],
                  zip_longest(it, it, fillvalue=0), 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM