【发布时间】: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