python 是否有一种方法可以将列表中的所有当前值作为列表解析的条件进行迭代?

wrrgggsh  于 2023-02-18  发布在  Python
关注(0)|答案(2)|浏览(130)

我有一个素数生成器,它需要迭代所有现有的素数,以确定一个被检查的值是否是素数,然后将其添加到列表中:

primes = [2]
max_num = 10000

for num in range(3, max_num+1, 2):
  is_prime = True
  for prime in primes:
    if num % prime == 0:
      is_prime = False
  if is_prime == True:
    primes.append(num)

print(primes)

有没有可能使用列表解析来完成这一点?以这样的方式?
primes = [x for x in range(2, max_num+1) for y in primes if x % y != 0]
我试着运行这段代码,但得到了一个“未定义质数”的错误。

w8ntj3qf

w8ntj3qf1#

另一个列表理解黑客没有人应该使用。只是为了好玩。与奖金黑客约int秒。

import gc

print([
    num
    for two in [(9**99 + 2) % 9**99]
    for nums in [[two], range(3, 100, 2)]
    for num in nums
    if num is two
       or all(num % prime
              for obj in gc.get_objects() if type(obj) is list and obj and obj[0] is two
              for prime in obj)
])

输出(在线试用!):

[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]

列表被注册用于循环垃圾收集,所以我使用它来查找解析所构建的列表对象。如何在所有其他列表中识别该列表?通过以一个特殊的2开始。不是通常的2,而是一个值为2的不同的int对象。该对象直接进入列表。之后,我遍历了范围内的奇数,通过寻找特殊的2在垃圾收集器中找到了列表,一旦找到了列表,我就遍历它来检查当前的num是否为素数。
优化版本,只搜索列表一次(尝试在线!):

import gc

print([
    num
    for two in [(9**99 + 2) % 9**99]
    for nums in [[two], range(3, 100, 2)]
    for num in nums
    for primes in [() if num is two else primes or next(obj for obj in gc.get_objects() if type(obj) is list and obj and obj[0] is two)]
    if all(num % prime for prime in primes)
])

num是我的2时,我给primes赋值一个空的哑元元组;当num3时,我找到列表并赋值给primes;对于后面的所有数字,我只把primes重新赋值给它自己。

pgky5nke

pgky5nke2#

如果您需要相当于一条线的解决方案,但在时间上效率不高

print([n for n in range(2, int(input())) if all(n % d for d in range(2,int(n**.5)+1))])

相关问题