Python |给出列表 [1,2,3,4] -> return 1*2+2*3+3*4

Python | Give list [1,2,3,4] -> return 1*2+2*3+3*4

所以正如我在标题中所说,我想将列表中的每两个邻居相乘并将它们全部相加 - 使用单个代码行。

我正在寻找最优雅、最有效的方法,而不使用额外的内存等。

这是我现在拥有的:

import numpy as np
G = lambda array: sum(np.multiply(array[:-1], array[1:])))

可以,但是当我写 array[:-1]array[1:] 时,它不会创建两个新数组吗?如果是这样,有没有办法用相同的原始数组来做到这一点?

或者您可以想出更好的方法:)

尝试以下操作:

    lst = [1,2,3,4]
    func = lambda lst: sum([lst[i]*lst[i+1] for i in range(len(lst)-1)])
    func(lst)

如果您不受 lambda 的限制,您可以:

def sum_with_neighbours(arr: list[int]) -> int:
    sum_ = 0
    for i in range(len(arr) - 1):  # -1 because we want to go until second-last item
        sum_ += arr[i] * arr[i + 1]
    return sum_

itertools.pairwise 可能是最 pythonic 的选择:

>>> from itertools import pairwise
>>> [*pairwise(range(5))]
[(0, 1), (1, 2), (2, 3), (3, 4)]
>>> sum(i * j for i, j in pairwise(range(5)))
20

实际的numpy方式

array = np.array([1, 2, 3, 4])

array[1:] @ array[:-1]

Out[]: 20

@ 是 dot-product 运算符,通常称为 multiply-sum 运算符。

如果您执着于 lambda,那就是:

G = lambda array: array[1:] @ array[:-1]