【问题标题】:Is there any way to condense a for-else loop in Python?有没有办法在 Python 中压缩 for-else 循环?
【发布时间】:2018-03-19 05:21:59
【问题描述】:

我编写了一段代码,它可以输出第 10001 个素数。它目前占用 4 行代码,想知道我是否可以进一步压缩它?在这里;

for i in range(3,104744,2):
    for x in range(3,int(i/2),2):
        if i % x == 0 and i != x: break
    else: print(i)

知道过多地压缩代码通常不是一件好事,但我想知道这是否可能。

谢谢。

【问题讨论】:

  • 该代码永远不会产生2,这是一个素数。
  • 我尝试将 DeMorgan 定律应用于您的 if 声明(i % x == 0 在功能上是 not i % x,因此您有两个 nots 可以分解出来,and 更改为 @987654328 @...) 导致 if not (i % x or i == x): break... 但字符数相同!
  • 您可以尝试将其全部放入列表理解中。
  • 我猜是 for p in (i for i in range(...) if all(i % x for x in range(...)) 但没关系

标签: python for-else


【解决方案1】:

您可以使用列表推导和any 来获得单线解决方案:

>>> [p for p in range(2, 100) if not any (p % d == 0 for d in range(2, int(p**0.5) + 1))]
[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]

它使用了一个事实,即除数不能大于它所除数的平方根。

它似乎工作正常:

>>> len([p for p in range(2, 104744) if not any (p % d == 0 for d in range(2,int(p**0.5)+1))])
10001

【讨论】:

    【解决方案2】:

    列表理解

    >>> r=range(2,100)
    >>> [p for p in r if [p%d for d in r].count(0)<2]
    

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

    【讨论】:

      【解决方案3】:

      试试这个:

      for i in range(3,100,2):
          if all( i%x for x in range(3, i//2, 2) ):
              print(i)
      

      【讨论】:

      • @eyllanesc,没有这样的要求问题,据我所知-我的代码比原始代码短
      猜你喜欢
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      相关资源
      最近更新 更多