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]
所以正如我在标题中所说,我想将列表中的每两个邻居相乘并将它们全部相加 - 使用单个代码行。
我正在寻找最优雅、最有效的方法,而不使用额外的内存等。
这是我现在拥有的:
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]