Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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_Math - Fatal编程技术网

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)来解决
这可能比进行额外迭代更快。