2

我在 Python 中编写了一个非常简单的函数,它打印出特定序列中的所有素数。

它工作正常,但它给我的结果中有太多的括号/括号。我希望将结果作为一个输出,其中包含一个包含所有数字的列表,而不是很多输出,每个输出都包含一个数字。

这是代码:

def prime_list(X, Y):
    Z = 0
    while X <= Y:
        if is_prime(X):
            Z = Z, X
        X = X + 1
    print (Z)

如果数字是质数,则代码中使用的函数is_prime()仅返回,否则返回。TrueFalse

基本上,对于每个循环,它都会检查是否X是素数。如果是,X将被添加到名为 的列表中Z。虽然,当它这样做时,它也会在列表中添加不必要的括号/括号。这是结果,使用序列 1-100:

>>> prime_list(1,100)
(((((((((((((((((((((((((0, 2), 3), 5), 7), 11), 13), 17), 19), 23), 29), 31), 37), 41), 43), 47), 53), 59), 61), 67), 71), 73), 79), 83), 89), 97)

如您所见,括号/括号太多了。

我怎样才能重写代码,所以它不会做这些?

4

4 回答 4

5

只需附加到列表而不是嵌套元组:

def prime_list(X, Y):
    Z = []
    while X <= Y:
        if is_prime(X):
            Z.append(X)
        X = X + 1
    return Z
于 2013-05-17T21:41:41.303 回答
3

不是直接的答案,但这是一种更清洁、更短的方法:

def prime_list(X, Y):
    return [ x for x in range(X, Y+1) if is_prime(x) ]
于 2013-05-17T21:48:05.857 回答
0

您还可以连接元组(附加到 时请注意尾随逗号Z):

def prime_list(X, Y):
    Z = ()
    while X <= Y:
        if is_prime(X):
            Z += X,
        X = X + 1
    print (Z)

不确定哪个更有效:附加到列表或连接元组......

于 2013-05-17T21:50:04.800 回答
0

在“z = z, x”行中,您所做的是分配给包含 z 和 x 的 za 列表。在第一次之后,当你到达这里时,z 总是一个列表,所以你得到一个新列表,包含旧列表和一个整数。因此,开始时 z = 0,然后是 0, 1,然后变成椭圆形......下一次,它变成 (0, 1), 2; 之前的列表(旧的 z)和新的 x。下一次,你会得到 ((0, 1), 2), 3,等等。

如果您使用 z.append(x),它会在列表中添加一个额外的项目,而不是每次都创建一个新的 2 元素列表。最后,使用 z.append(x),您将得到 (0, 1, 2, 3, ...),这更接近您的预期。

于 2013-05-18T18:11:23.233 回答