【问题标题】:Prime factorization using list comprehension in Python在 Python 中使用列表推导进行素数分解
【发布时间】:2018-10-29 13:14:30
【问题描述】:

如何编写一个函数,该函数返回一个元组列表,例如 (c_i, k_i) for n 使得 n = c1^k1 * c2^k2 * ... , ci 是一个素数。
例如:12600 = 2^3 * 3^2 * 5^2 * 7^1
所需输出:[(2, 3), (3, 2), (5, 2), (7, 1)]
我知道如何使用 while 来完成此操作,但是否可以使用列表理解来完成此操作?此任务不需要效率。

# naive function 
def is_prime(n):
    return n > 1 and all(n % i != 0 for i in range(2, n))

# while version
def factorization_while(n):
    res = []
    for i in range(1, n + 1):
        if is_prime(i):
            j = 0
            while n % i == 0:
                n = n // i
                j += 1
            if j != 0:
                res.append((i, j))
    return res

# list comprehension version
def factorization(n):
    return [
        (i, j) for i in range(1, n + 1) if is_prime(i) \
        and n % i == 0 ... # add smth
    ]

【问题讨论】:

  • 将所有内容压缩到一个单行列表理解中绝不是推荐的方式。不太冗长的代码和冗长但可读/可理解的代码之间有一条细线
  • @Bazingaa 我知道它的可读性会降低,但我只是想测试一下自己是否能够做到,并从中学习新东西

标签: python python-3.x list-comprehension factorization


【解决方案1】:

我认为这应该不会太难。你实际上不需要修改n 来找到它的主要因素,它们都是完全相互独立的。因此,只需遍历适当的素数,并找到有效的最大功率!

from math import log

def prime_factors(n):
    return [(prime, max(power for power in range(1, int(log(n, prime))+1)
                              if n % prime**power == 0))
            for prime in range(2, n+1) if n % prime == 0 and isprime(prime)]

您可以通过几种方法进一步改进这一点。您可以在无限的幂生成器上使用itertools.takewhile(例如itertools.count),因为一旦您找到第一个幂使得prime**power 不是n 的一个因素,后面的任何一个都不是。这样您就可以避免log 调用。

并且有很多方法可以有效地迭代素数(例如,请参阅建议的非常简单的生成器here,或者您可以在a fewdifferent questions 的答案中找到更高性能的版本@ 这里关于 SO)。

【讨论】:

    猜你喜欢
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多