列表中除该索引处的整数外的整数的乘积



我正在努力做,例如;

给定列表[1,7,3,4]

输出如下:[84,12,28,21]通过计算[7*3*4, 1*3*4, 1*7*4, 1*7*3]

我尝试了一个计数器,然后每次增加它的' 1 ',但它不起作用,因为有时整数是列表的中间。怎样才能做出这个问题的算法呢?

如果所有元素都是非零整数,那么取整个数组的乘积然后除以每个元素怎么样?例子——

>>> lst = [1,7,3,4]
>>> prod = 1
>>> for i in l:
...     prod *= i
...
>>> newlst = [prod//i for i in lst]
>>> newlst
[84, 12, 28, 21]

使用//进行整数除法。

以更少的行数完成(2行,不考虑导入/列表定义等)-

>>> from functools import reduce
>>> from operator import mul
>>> lst = [1,7,3,4]
>>> prod = reduce(mul,lst)
>>> newl = [prod//i for i in lst]
>>> newl
[84, 12, 28, 21]

你可以这样做:

out = [product(n for i, n in enumerate(in_) if i != index) 
       for _, index in enumerate(in_)]

其中product处理数字的可迭代对象以得到总积,例如

def product(nums):
    return functools.reduce(operator.mul, nums, 1)

我的技术类似于Anand S Kumar的(但是我写这篇文章的时候只有一个其他的答案:))。所有元素相乘&然后除以每个元素来创建输出列表,这比对n个元素中的每个元素执行n-1次乘法要有效得多,特别是当n很大时。

from operator import mul
from functools import reduce
def lagrange(seq):
    #Find the product of all elements
    prod = reduce(mul, seq, 1)
    return [prod // i for i in seq]
a = [1, 7, 3, 4]
print a, lagrange(a)
a = [1, 2, 3, 4, 5, 6]
print a, lagrange(a)

[1, 7, 3, 4] [84, 12, 28, 21]
[1, 2, 3, 4, 5, 6] [720, 360, 240, 180, 144, 120]

在Python 2中,reduce()是内置的,但你可以从functools中导入它;在Python 3中,它只有在从functools中导入时才可用。

我把这个函数命名为拉格朗日,因为这个过程让我想起了拉格朗日多项式插值。

from functools import reduce
import itertools
import operator
a = [1,7,3,4]
[reduce(operator.mul, i, 1) for i in itertools.combinations(a, len(a) - 1)][::-1]
numbers=[2,3,0]
arr=np.ndarray(len(numbers),int)
for i in range(len(numbers)):
    arr[i]= np.prod(numbers[i+1:])*np.prod(numbers[0:i])
print(arr)

最新更新