我正在练习列表推导和嵌套列表推导。作为我练习的一部分,我写出了等效的循环。这个for循环我无法正确,我相信这是因为我试图在函数调用中分配值而不是变量。我收到的错误是:
File "<stdin>", line 4
SyntaxError: can't assign to function call
我为此循环编写的代码是:
import math
def squared_primes():
list = []
for x in range(1,1000000):
for q in range(2,math.sqrt(x)+1):
if all(x % q != 0):
list.append(x**2)
print(list)
此函数正在尝试创建一个完美正方形列表,其根是素数,范围为1到1000000.
有人可以帮我理解我的循环语法究竟在哪里发生故障吗?另外,我可以将其作为嵌套列表理解吗?很明显,我的列表理解正在崩溃,因为我无法正确地获得我的for循环语法......
解决方案:感谢用户@Evan,我能够解决变量和语法问题,并对如何修复this thread中的all()
语句进行了一些提示
此代码将正确返回1,1000的平方素数列表:
def squared_primes():
list1 = []
for x in range(1,1000):
if all(x%q !=0 for q in range(2,int(math.sqrt(x)+1))):
list1.append(x**2)
print(list1)
答案 0 :(得分:0)
这非常简洁。列表理解是光荣的。
def squared_primes(maximum):
return( [ x**2 for x in range(0,maximum) if all( x % i for i in range(2, x) ) ] )
print(squared_primes(1000000))
答案 1 :(得分:0)
此代码将正确返回平方素数列表 1,1000:
除了它返回1作为列表的第一个元素,1的平方根不是素数。让我们修复这个故障并将代码重写为正确的函数:
from math import sqrt
def squared_primes(maximum):
primes = []
for number in range(2, maximum):
if all(number % divisor != 0 for divisor in range(2, int(sqrt(number)) + 1)):
primes.append(number ** 2)
return primes
print(squared_primes(1000))
顺便说一句,这个不是列表理解:
all(x % q !=0 for q in range(2, int(math.sqrt(x) + 1)))
它是一个生成器!如果你想要一个列表理解你可以做到:
all([x % q !=0 for q in range(2, int(math.sqrt(x) + 1))])
但坚持使用发电机,因为它能够以较少的努力使复合材料失效。
当我们要求一个高达1000000(百万)或更多的广场列表时,您的代码将开始陷入困境。那时我们想要一个更有效的基于筛选的算法,如:
def squared_primes(maximum):
sieve = [True] * maximum
if maximum > 0:
sieve[0] = False # zero is not a prime
if maximum > 1:
sieve[1] = False # one is not a prime
for index in range(2, int(maximum ** 0.5) + 1):
if sieve[index]:
prime = index
for multiple in range(prime + prime, maximum, prime):
sieve[multiple] = False
return [index * index for index in range(maximum) if sieve[index]]
大约一百万,此代码将返回比基于部门的解决方案快20倍的结果。
和@Evan的光荣的理解,因为它缺少你的math.sqrt()
优化,将比任何一个都慢几个数量级(我还在等待它完成一百万)和以两个不正确的结果启动列表。我们可以通过以下方式与您修改后的代码进行时间间隔:
from math import sqrt
def squared_primes(maximum):
return [number ** 2 for number in range(2, maximum) if all(number % divisor for divisor in range(2, int(sqrt(number)) + 1))]
print(squared_primes(1000))
这个是列表理解。但是,错误的方法又回过头来看看基于筛选的实现。