Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 给定一个整数列表,查找由除当前索引外的所有元素的乘积组成的列表_Python_Precision_Floating Accuracy - Fatal编程技术网

Python 给定一个整数列表,查找由除当前索引外的所有元素的乘积组成的列表

Python 给定一个整数列表,查找由除当前索引外的所有元素的乘积组成的列表,python,precision,floating-accuracy,Python,Precision,Floating Accuracy,我正在使用Python 3.8 例如,考虑一个(严格的)正整数列表 L = [1,2,3,4,5] 我的任务是计算一个新的列表,使得它的第i个元素是L中除第i个元素之外的所有元素的乘积。因此,对于给定的L,我们的结果将是 R = [120, 60, 40, 30, 24] 显然,我能做到 R = [functool.reduce(operator.mul, [L[ix] for ix in range(len(L)) if ix != k]) for k in range(len(L))]

我正在使用Python 3.8

例如,考虑一个(严格的)正整数列表

L = [1,2,3,4,5]
我的任务是计算一个新的列表,使得它的第i个元素是L中除第i个元素之外的所有元素的乘积。因此,对于给定的L,我们的结果将是

R = [120, 60, 40, 30, 24]
显然,我能做到

R = [functool.reduce(operator.mul, [L[ix] for ix in range(len(L)) if ix != k]) for k in range(len(L))]
然而,这具有二次时间复杂度


从数学上讲,简单地将L的所有元素相乘,然后通过将该乘积除以L的每个元素来构造R,效率会更高。当然,这有一个浮点精度限制,在我的计算机中,它不适用于大型列表(len(L)约10^4,数字介于1和1000之间)


有什么想法吗?请注意,如果第二种方法有效,时间复杂度将降低为线性。

您很幸运,因为Python具有任意精度整数!实际上,你可以把它们相乘,然后除以给定的整数:

L=[1,2,3,4,5]
prod=1
对于L中的el:
产品*=el
R=[prod//el代表L中的el]

请注意,使用整数除法
/
。由于所有元素
el
都是按结构划分的
prod
的因子,因此这总是导致精确划分。仅使用
/
将导致浮点除法,可能会引入错误。

您很幸运,因为Python具有任意精度整数!实际上,你可以把它们相乘,然后除以给定的整数:

L=[1,2,3,4,5]
prod=1
对于L中的el:
产品*=el
R=[prod//el代表L中的el]

请注意,使用整数除法
/
。由于所有元素
el
都是按结构划分的
prod
的因子,因此这总是导致精确划分。使用just
/
会导致浮点除法,可能会引入错误。

“使用just/会导致浮点除法,可能会引入错误。”为什么?如果我们知道
b
a
的一个因子,那么
a/b
是一个整数。无论如何,
/
没有理由引入错误,OP已经提到,这种方法对于特定长度的列表在他的系统中不起作用。谢谢,我使用了int(big_num/small_num)*small_num,但这不是big_num(我不知道为什么,但它只是不起作用)。@DeepSpace不,这是有效的<代码>a/b只能给出大约17位的准确度,如果数字有100位,这显然是不够的。相反,
a//b
给出所有数字。@WillM。编写
int(big_num/small_num)*small_num
相当于
int(float(big_num)/float(small_num))*small_num
,也就是说
/
附带了一个隐式转换为
float
“使用just/将导致浮点除法,可能引入错误。”为什么?如果我们知道
b
a
的一个因子,那么
a/b
是一个整数。无论如何,
/
没有理由引入错误,OP已经提到,这种方法对于特定长度的列表在他的系统中不起作用。谢谢,我使用了int(big_num/small_num)*small_num,但这不是big_num(我不知道为什么,但它只是不起作用)。@DeepSpace不,这是有效的<代码>a/b只能给出大约17位的准确度,如果数字有100位,这显然是不够的。相反,
a//b
给出所有数字。@WillM。编写
int(big_num/small_num)*small_num
相当于
int(float(big_num)/float(small_num))*small_num
,即
/
带有一个隐式转换为
float
“它在我的计算机中不适用于大列表”怎么不起作用?要花很长时间吗?你有内存错误吗?如果是后者,则可以使用一次生成一个元素的生成器,而不是将整个列表存储在memory@DeepSpace:表示乘积除以元素无效的句子表示它有浮点精度限制。这就告诉了你为什么它不起作用,以及它是如何起作用的。“它在我的计算机中不适用于大列表”它怎么不起作用?要花很长时间吗?你有内存错误吗?如果是后者,则可以使用一次生成一个元素的生成器,而不是将整个列表存储在memory@DeepSpace:表示乘积除以元素无效的句子表示它有浮点精度限制。这就是告诉你为什么它不起作用,以及如何起作用。