Python 获取给定整数的整因子对列表的最简单方法是什么?
获取给定整数的整因子对列表的最简单方法是什么 例如:Python 获取给定整数的整因子对列表的最简单方法是什么?,python,math,Python,Math,获取给定整数的整因子对列表的最简单方法是什么 例如:f(20)将返回[(1,20)、(2,10)、(4,5)]这个如何: def f(n): from itertools import takewhile if not isinstance(n,int): raise ValueError("supplied %s type, requires integer input" %(type(n).__name__)) return [(i,n/i) fo
f(20)
将返回[(1,20)、(2,10)、(4,5)]
这个如何:
def f(n):
from itertools import takewhile
if not isinstance(n,int):
raise ValueError("supplied %s type, requires integer input" %(type(n).__name__))
return [(i,n/i) for i in takewhile(lambda x:x*x<n,xrange(1,n)) if (n%i)==0]
def(n):
从itertools导入takewhile
如果不是isinstance(n,int):
raise VALUERROR(“提供的%s类型,需要整数输入“%”(类型(n)。\uuuuu名称\uuuuuu))
对于takewhile中的i返回[(i,n/i)(λx:x*x或此:
def f(n):
factors_list = []
for i in xrange(1, int(n**0.5) + 1):
if n % i == 0:
factors_list.append((i, n/i))
return factors_list
print f(20)
编辑:或使用列表理解在一行中编辑:
def f(n):
return [(i, n / i) for i in xrange(1, int(n**0.5) + 1) if n % i == 0]
print f(36)
def f(val):
return [(i, val / i) for i in range(1, int(val**0.5)+1) if val % i == 0]
EDIT2:如果希望函数用于负整数(以及0和正整数),请使用:
或者同样的事情,使用列表理解:
def f(n):
return [(i, n / i) for i in xrange(1, int(n**0.5) + 1) if n % i == 0]
print f(36)
def f(val):
return [(i, val / i) for i in range(1, int(val**0.5)+1) if val % i == 0]
部分重叠的可能重复,但问题不同。第二行有太多错误…(1)assert
用于健全性检查,而不是输入验证。(2)显式类型检查通常是个坏主意。(3)但如果这样做,至少要使用isinstance
(考虑继承)。(4)另外,如果您必须检查类型是否完全是T
,那么最好使用type(…)is T
-is
更适合于单例(一个类型本质上是一个),并且=
可能会有一个中断的重载。您为什么这样做(n/i)*i==n,而不是使用mod(%)?@Benjamin:不使用整数除法,整数除法会截断。虽然在Python 3中你是对的,因为他们将/
更改为始终返回浮点。检查类型很愚蠢,但如果必须这样做,不要只打印一条消息并试图混过去。提出一个类型错误。但说真的,不要检查参数类型。我认为你的列表理解力很强是向后的。我还认为当你看到一个好的答案时,承认它比把它编辑成你自己的答案更酷。@odonell:xrange
在使用大数字时加快速度(但是在Python 3中不需要),ceil
为了清晰和简洁。难道不从因子列表中删除一个整数平方根吗?你需要给它加上1。@Brendan:你有例子吗?我喜欢你的一行,不需要显式创建一个空列表就好了。@Benjamin:如果n=16,这个范围会给我们1->4,因为'math.ceil(16**0.6)=4'。由于xrange和range从迭代中排除了最终值,我们将无法在因子_列表中包含(4,4)。我添加了硬编码因子1以对函数进行微观优化(因为执行%1没有什么意义)-但人们对此有何看法?代码的混乱和无法接受小于1的值是否超过了异常小的优化?这有点问题,因为它返回1作为0的因子,这是“不正确的”。这可以通过执行result=[(1,value)]*(value>0)来解决
这可能比进行额外迭代更快。