检查列表理解中的列表长度(基于列表理解中的元素计数的迭代)

问题描述 投票:3回答:3

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

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

输出:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

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

python python-2.7 list list-comprehension
3个回答
5
投票

“Pythonic”方式是使用generator,加上islice函数:

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的无限“列表”,您可以通过多种方式使用列表,但它实际上只会计算您需要的值。


4
投票

使用itertools.islice结合filter使您的计算变得懒惰。

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]

3
投票

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

如果必须使用列表推导,则可以创建生成器函数以返回范围中的下一个素数。在列表推导中,在生成器对象上调用next()(使用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持有的最终价值将是:

>>> primes
[2, 3, 5, 7, 11]

正如在robbrit's answer中所建议的那样,Pythonic实现这一目标的方法是使用itertools.islice(但它不是你所要求的列表理解):

>>> 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
© www.soinside.com 2019 - 2024. All rights reserved.