我一直在使用Python,并编写了以下代码来查找给定范围内的所有素数,如下所示:
def get_primes(x):
primes = []
def is_prime(x):
if x == 0:
return
else:
for i in range(2, int(x)):
if (x % i) == 0:
return is_prime(x - 1)
else:
return x, is_prime(x - 1)
primes.append(is_prime(x))
return primes
print(get_primes(int(input("Enter the range: 0 - "))))
输出为:(例如,输入100)
Enter the range: 0 - 100
[(97, (89, (83, (79, (73, (71, (67, (61, (59, (53, (47, (43, (41, (37, (31, (29, (23, (19, (17, (13, (11, (7, (5, (3, (2, (1, None))))))))))))))))))))))))))]
看起来很丑。 因此,我需要一种扁平化递归元组结构的方法:
[97, 89, 83, 79, 73, 71, 67, 61, 59, 53, 47, 43, 41, 37, 31, 29, 23, 19, 17, 13, 11, 7, 5, 3, 2, 1]
我使用以下代码来做到这一点:
x = get_primes(100)
arr = []
arr.append(x[0][0])
arr.append(x[0][1][0])
arr.append(x[0][1][1][0])
arr.append(x[0][1][1][1][0])
arr.append(x[0][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
arr.append(x[0][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][0])
print(arr)
但是,这当然不是专业方法。
所以,我想要知道的是我该怎么做:
[97, 89, 83, 79, 73, 71, 67, 61, 59, 53, 47, 43, 41, 37, 31, 29, 23, 19, 17, 13, 11, 7, 5, 3, 2, 1]
来自此:
[(97, (89, (83, (79, (73, (71, (67, (61, (59, (53, (47, (43, (41, (37, (31, (29, (23, (19, (17, (13, (11, (7, (5, (3, (2, (1, None))))))))))))))))))))))))))]
我在这里How to flatten a tuple in python找到了答案,但是那里的代码是python 2的,所以我做了一些修改。
并使用以下代码:
def flatten(T):
if type(T) is not tuple:
return (T,)
elif len(T) == 0:
return ()
else:
return flatten(T[0]) + flatten(T[1:])
答案 0 :(得分:4)
您可以轻松地将功能调整为generator:
def is_prime(x):
if x != 0:
for i in range(2, int(x)):
if (x % i) == 0:
yield from is_prime(x - 1)
return
else:
yield x
yield from is_prime(x - 1)
然后要使所有素数最多为100,可以将该生成器传递给list
以获取包含该生成器的值的列表:
print(list(is_prime(100)))
# [97, 89, 83, 79, 73, 71, 67, 61, 59, 53, 47, 43, 41, 37, 31, 29, 23, 19, 17, 13, 11, 7, 5, 3, 2, 1]
虽然递归并不是解决此问题的好方法,但我建议查找Sieve of Eratosthenes以寻求更好的方法。
yield from
语法仅在较新版本的Python(> = 3.3)中可用。您可以替换
yield from x
使用
for y in x:
yield y
如有必要。
答案 1 :(得分:1)
如果您创建一个嵌套的元组,那么扁平化它的唯一方法就是解压缩。最好的解决办法就是不创造一个。 这是您的代码的替代版本:
def get_primes(limit):
def is_prime(x):
if x in (2, 3):
return True
if (x % 2 == 0) or (x % 3 == 0):
return False
i, w = 5, 2
while i**2 <= x:
if x % i == 0:
return False
i += w
w = 6 - w
return True
return [x for x in range(2, limit + 1) if is_prime(x)]
print(get_primes(int(input("Enter the range: 0 - "))))