我一直在寻找,但无法弄清楚这一点。
所以我有一个找到主要因素的函数。1,000 的质因数是[2, 2, 2, 5, 5, 5]
.
我想要一个函数将这个列表转换成这样:
[[2,3], [5,3]]
我想展示力量,而不是重复的因素。
我只是无法缝合以使其工作。
我一直在寻找,但无法弄清楚这一点。
所以我有一个找到主要因素的函数。1,000 的质因数是[2, 2, 2, 5, 5, 5]
.
我想要一个函数将这个列表转换成这样:
[[2,3], [5,3]]
我想展示力量,而不是重复的因素。
我只是无法缝合以使其工作。
除了collections.Counter
,您还可以执行以下操作:
>>> lst = [2, 2, 2, 5, 5, 5]
>>> [[x, lst.count(x)] for x in set(lst)]
[[2, 3], [5, 3]]
>>>
这是使用速度的测试timeit.timeit
:
>>> from timeit import timeit
>>>
>>> # Oscar's
>>> test = """
... from collections import Counter
... lst = [2, 2, 2, 5, 5, 5]
... [[x, y] for x, y in Counter(lst).items()]
... """
>>> timeit(test, number=10000)
0.323039660068531
>>>
>>> # Mine
>>> test = """
... lst = [2, 2, 2, 5, 5, 5]
... [[x, lst.count(x)] for x in set(lst)]
... """
>>> timeit(test, number=10000)
0.04072053850418911
>>>
你可以这样做:
from collections import defaultdict
from math import sqrt
def factor(n):
i = 2
limit = sqrt(n)
while i <= limit:
if n % i == 0:
yield i
n = n / i
limit = sqrt(n)
else:
i += 1
if n > 1:
yield n
def pfac(num):
d=defaultdict(int)
for f in factor(num):
d[f]+=1
terms=[]
for e in sorted(d.keys()):
if d[e]>1:
terms.append('{:,}^{}'.format(e,d[e]))
else:
terms.append('{:,}'.format(e))
print ' * '.join(terms),'=','{:,}'.format(num)
pfac(1000)
印刷2^3 * 5^3 = 1,000
并适用于相当大的数字:
pfac(1000**12-1)
# 3^4 * 7 * 11 * 13 * 19 * 37 * 101 * 9,901 * 52,579 * 333,667 * 999,999,000,001 = 999,999,999,999,999,999,999,999,999,999,999,999