[英]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.