2017-05-08 61 views
1

在Python中将列表中所有元素的值减1的最Python化和优雅的方式是什么?Python:将列表中的所有元素相乘,但先减1 1.

即,计算(p [0] -1)*(p [1] -1)* ... *(p [n-1] -1)其中n是列表p的大小。

+2

请阅读并按照帮助发帖准则文档。 [最小,完整,可验证的示例](http://stackoverflow.com/help/mcve)适用于此处。在您发布代码并准确描述问题之前,我们无法有效帮助您。 StackOverflow不是一个编码或教程服务。 – AChampion

回答

0

使用numpy

import numpy as np 
np.prod(np.array(p)-1) 

或者使用内置的一个一个Python,例如operator

reduce(operator.mul,\ 
     map(lambda el:el-1,\ 
      p),\ 
     1) 
+0

我很好奇这个-1。我会很高兴知道为什么**这项工作,并提出问题**。 – Kanak

0
>>> l = [5, 8, 7, 2, 3] 
>>> reduce(lambda x, y: x*(y-1), l, 1) #multiply each item by its subtracted value 
336 
>>> 

感谢@AChampion另一个改进

+0

注意:'reduce'在py3的'functools'中。你可以在reduce中减去一个:'reduce(lambda x,y:x *(y-1),l,1)'。 – AChampion

1

使用functools.reduce在python3随着AJ的例子:

>>> l = [5, 8, 7, 2, 3] 
>>> l = [item-1 for item in l] #subtract 1 
>>> functools.reduce(lambda x, y: x*y, l) #multiply each item 
336 
>>> 
+1

通过解释代码的作用来增强对代码的回答。解释你的代码将有助于未来用户理解正在发生的事情,并根据自己的需求调整你的答案。 –

-1

有很多种方法繁殖的所有元素一个可迭代的。

所以,对于一个列表a就可以了,例如:

使用numpy的:

prod([x-1 for x in a]) 

使用Lambda和functools

functools.reduce(lambda x, y: x*y, [x-1 for x in a]) 

做手工

result=1 
for x in [x-1 for x in a]: result*=a 

请注意,我用的列表理解:[x-1 for x in a],但它也可以用numpy的实现:array(a)-1


相关问题:What's the Python function like sum() but for multiplication? product()?

+0

为什么downvote? –

-1
result = 1 
for x in p: 
    result *= x - 1 
+0

恩,downvote究竟是什么? –

+1

您的答案被标记为低质量;可能是因为你没有解释如何或为何回答这个问题。我认为downvote来自低质量队列。 – Ben

+1

@Ben好吧,这可能会解释它。 Morons不会被打扰阅读这个问题,并且认为即使是最明显且自明的代码也需要用额外的文本来稀释...... –

相关问题