【问题标题】:convert double for loop with lambda function and break to list comprehension使用 lambda 函数和 break 将 double for 循环转换为列表理解
【发布时间】:2017-10-06 03:43:10
【问题描述】:

我有以下代码需要转换为list-comprehension(一个班轮)。但是,我无法这样做。 该代码计算素数,直到输入范围为A

def sieve(A):    
    l = []
    f = lambda x : int(x**0.5)
    for p in range(2,A+1):        
        for i in range(2, f(p) + 1):
            if p % i == 0:
                break
        else:
            l.append(p)
    return l

到目前为止,我一直在关注哪些不起作用。尤其是for-loop 中的break 让我失望。

list(set([val for sublist in [[p  for i in range(2, f(p) + 1) if p %i != 0 ] for p in range(2,A) ] for val in sublist]))

编辑
为问题添加约束。 代码只能是一个语句,没有evalexec。代码长度不得超过 160 个字符。

【问题讨论】:

  • 为什么?我很同情必须尝试破译此列表理解的人。
  • 为什么首先要将其转换为列表理解?
  • 我知道,这是一个在线问题的一部分,它只接受一个班轮解决方案。除非有其他方法可以提供一个衬垫。
  • 关于在列表理解中添加中断条件 - stackoverflow.com/questions/9572833/break-list-comprehension
  • 我的意思是,不推荐,但总有Oneliner-izer

标签: python lambda list-comprehension


【解决方案1】:
[p for p in range(2,A+1) if next((i for i in range(2, int(p**0.5) + 1) if (p % i) == 0),None)==None]

代码长度为 100 个字符。
我们使用next() 来突破迭代。
说明

def sieve(A):
  [p for p in range(2,A+1) if getFirstDiv(p)==None]

def getFirstDiv(p):
  next(divIter(p),None)

def divIter(p):
  return (i for i in range(2, int(p**0.5) + 1) if (p % i) == 0)

输出

15 --> [2, 3, 5, 7, 11, 13]
10 --> [2, 3, 5, 7]

【讨论】:

  • 啊,所以我错过了 next(),很高兴知道。即使在给定的时间限制内 A=10000+,它也能完美运行。谢谢。
【解决方案2】:

这一个班轮可以做到:

[r for r in [i*all([i if i%j!=0 else 0 for j in range(2,i)]) for i in range(2,x)] if r>0]

你只需要设置x(最大值)。

注意:虽然我猜效率不是这个问题的目的,但它并不是特别有效。

解释(扩展代码):

filtered = []
primes = []

for i in range(2,x):
    # Check that all numbers up to i do not divide i
    # I realise we only need to check up to int(sqrt(i))
    condition = all([i if i%j!=0 else 0 for j in range(2,i)])

    # Exploit Python's treatment of bool: number*True = number and number*False=0
    filtered.append( i*condition )


for r in filtered:
    # Take out all the zeros
    if r>0:
        primes.append(r)

【讨论】:

    猜你喜欢
    • 2020-03-29
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多