检查列表理解中的列表长度(根据列表理解中的元素计数进行迭代)

2024-04-25 19:25:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我只需要计算前五个素数。我想检查列表的长度,同时在列表理解中构建它。以下代码不起作用。在

def checkPrime(n):
    for i in range(2,int(n**0.5)+1):
        if n%i==0:
            return False
    return True



 primes = [] 
 primes = [x  for x in range(2,30) if(checkPrime(x) and len(primes)<6) ] 
 print primes

输出:

^{pr2}$

为什么len(primes)<6在这里不工作。我怎么才能做到呢?在


Tags: 代码infalsetrue列表forlenreturn
3条回答

itertools.islicefilter结合使用可使计算变懒。在

from itertools import islice

def checkPrime(n):
    for i in range(2,int(n**0.5)+1):
        if n%i==0:
            return False
    return True

primes = filter(checkPrime, range(2, 10**100))

list(islice(primes, 6))  # [2, 3, 5, 7, 11, 13]

List Comprehension创建并返回新列表。在代码中,在List Comprehension中,len(primes)将始终返回零,因为在列表理解完成并返回新列表之前,列表的长度不会更新。在

如果您必须使用列表理解,您可以创建一个生成器函数来返回范围内的下一个素数。在列表理解中,调用生成器对象上的^{}(使用range限制所需值的计数)。在

例如:

def checkPrime(n):
    for i in range(2,int(n**0.5)+1):
        if n%i==0:
            return False
    return True

# Generator function
def getPrimes(n):
    for x in range(2, n):
        if(checkPrime(x)):
            yield x

# Create Generator object
primes_gen = getPrimes(30)

# List comprehension to get primes
primes = [next(primes_gen) for _ in range(5)]
#         ^                               ^ required count of prime numbers in list
#         ^ to get next prime number

primes保存的最终值为:

^{pr2}$

正如robbrit's answer中所建议的,实现这一点的python方法是使用^{}(但它不是您所要求的列表理解)

>>> from itertools import islice

#    v type-casting it to list for displaying the list, 
#    v   as `islice` also returns a generator object
>>> list(islice(getPrimes(30), 5))
[2, 3, 5, 7, 11]  # ^ generator function from my older example

“Pythonic”方法是使用generator,再加上^{}函数:

from itertools import islice

def checkPrime(n):
    for i in range(2,int(n**0.5)+1):
        if n%i==0:
            return False
    return True

def primes():
    i = 2
    while True:
        if checkPrime(i):
            yield i
        i += 1

first_5 = list(islice(primes, 5))

这将创建一个名为primes的无限“列表”,您可以以多种方式使用列表,但它实际上只计算您需要的值。在

相关问题 更多 >