2

我一直在寻找,但无法弄清楚这一点。

所以我有一个找到主要因素的函数。1,000 的质因数是[2, 2, 2, 5, 5, 5].
我想要一个函数将这个列表转换成这样: [[2,3], [5,3]]

我想展示力量,而不是重复的因素。

我只是无法缝合以使其工作。

4

3 回答 3

3

尝试以下,使用Counter列表理解

from collections import Counter

lst = [2, 2, 2, 5, 5, 5]
[[x, y] for x, y in Counter(lst).items()]

=> [[2, 3], [5, 3]]

以上还有一个额外的优势,即列表中的因素可以按任何顺序出现——它们不需要排序。

于 2013-11-06T18:36:24.790 回答
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
>>>
于 2013-11-06T18:40:05.000 回答
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
于 2013-11-06T18:44:24.797 回答