计算列表中的重复项,并将该数字放入子列表中?

时间:2013-11-06 18:33:37

标签: python python-3.x

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

所以我有一个能找到素因子的函数。 1,000的主要因素是[2, 2, 2, 5, 5, 5] 我想要一个函数将此列表转换为如下所示: [[2,3], [5,3]]

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

我无法接缝以使其发挥作用。

3 个答案:

答案 0 :(得分:3)

使用Counterlist comprehension

尝试以下操作
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