我有一个简单的例子, 创建一个程序,询问用户一个数字,然后打印出该数字的所有除数的列表。
我正在解决这个问题:
n = 4
list_range = list(range(1,n+1))
divisor_list = []
divisor_list.append([i for i in list_range if n%i==0])
print divisor_list
#output:
#[[1, 2, 4]]
我希望输出为[1, 2, 4]
我可以通过以下方式实现这一目标:
n = 4
list_range = list(range(1,n+1))
divisor_list = []
for i in list_range:
if n % i == 0:
divisor_list.append(i)
print divisor_list
#output:
#[1, 2, 4]
但有没有更好的方法来实现这一目标?
答案 0 :(得分:1)
使用extend
:
divisor_list.extend([i for i in list_range if n%i==0])
答案 1 :(得分:1)
您不需要追加,只需使用:
divisor_list = [i for i in list_range if n% i == 0]
这样你只需分配列表理解的结果,给你一个干净的清单。无需附加列表,将列表嵌套在列表中,无需初始化为空列表。这是多余的,因为您只是在下一行添加到列表中。只需分配列表理解。正如提到的@joel goldstick,你可以循环遍历list_range
的 half ,因为如果它超过1/2的数字,那么什么都不会是分裂:
list_range = list(range(1, (n / 2) + 1))
答案 2 :(得分:1)
您可以使用将列表推导的结果分配给变量。
答案 3 :(得分:1)
您根本不需要将divisor_list
初始化为空序列。你附加的理解是你正在寻找的实际答案。
divisor_list = [i for i in list_range if n%i==0]
答案 4 :(得分:1)
循环遍历各种数字是没有意义的,这是浪费!试着证明在n / 2之后没有更多的除数,这是另一个基准版本,比较另一种方法f2
:
import math
import timeit
def f1(num):
return [i for i in range(1, num + 1) if num % i == 0]
def f2(num):
square_root = int(math.sqrt(num)) + 1
output = []
for i in range(1, square_root):
if (num % i == 0 and i * i != num):
output.append(i)
output.append(num / i)
if (num % i == 0 and i * i == num):
output.append(i)
return output
def bench(f, N):
for n in range(1, N):
f(N)
N = 10000
print timeit.timeit('bench(f1, N)', setup='from __main__ import bench, f1, N', number=1)
print timeit.timeit('bench(f2, N)', setup='from __main__ import bench, f2, N', number=1)
我的cpu上的结果是:
4.39642974016
0.124005777533
f2不会给出排序列表,但这是无关紧要的,你没有在你的问题中提到