如何删除外部列表?

时间:2016-09-06 12:42:10

标签: python list python-2.7

我有一个简单的例子, 创建一个程序,询问用户一个数字,然后打印出该数字的所有除数的列表。

我正在解决这个问题:

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]

但有没有更好的方法来实现这一目标?

5 个答案:

答案 0 :(得分:1)

使用extenddivisor_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不会给出排序列表,但这是无关紧要的,你没有在你的问题中提到