我一直在寻找,但无法弄清楚这一点。
所以我有一个能找到素因子的函数。
1,000的主要因素是[2, 2, 2, 5, 5, 5]
我想要一个函数将此列表转换为如下所示:
[[2,3], [5,3]]
我想展示权力,而不是重复的因素。
我无法接缝以使其发挥作用。
答案 0 :(得分:3)
from collections import Counter
lst = [2, 2, 2, 5, 5, 5]
[[x, y] for x, y in Counter(lst).items()]
=> [[2, 3], [5, 3]]
以上具有额外的优势,即列表中的因子可以按任何顺序出现 - 它们不需要排序。
答案 1 :(得分:0)
除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
>>>
答案 2 :(得分:0)
你可以这样做:
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