怎么把这个reduce写的代码改成for来写

时间:2022-03-05 20:17:57
这段代码是求素数的,reduce看起来吃力,要按照同样的算法来做
谢谢各位大神 


reduce(lambda i,n: i if 0 in [n%x for x in i] else i+[n] , xrange(2,100), [])

15 个解决方案

#1


F = lambda i, n: i if 0 in [n % x for x in i] else i + [n]
R = []
for i in range(2, 100):
    R = F(R, i)
print R


def Fi(i, n):
    res = [n % x for x in i]
    if 0 in res:
        return i
    else:
        return i + [n]
R = []
for i in range(2, 100):
    R = Fi(R, i)
print R


#2


引用 1 楼 bugs2k 的回复:
Python code?12345F = lambda i, n: i if 0 in [n % x for x in i] else i + [n]R = []for i in range(2, 100):    R = F(R, i)print R
Python code?12345678910def Fi(i, n):    res = [n % x for x ……

谢谢,很强大!
另外,想知道这个算法还能不能再优化呢,就是减少判断次数,类似从n/2到sqrt(n)

#3


def F(l, n):
    for x in l:
        if n % x == 0:
            return
    l.append(n)

def P(l, n):
    from math import sqrt
    m = sqrt(n)
    for x in l:
        if (x <= m) and (n % x == 0):
            return
    l.append(n)

R = []
for i in range(2, 100):
    P(R, i)
print R

不知道F和P,谁更快?

#4


def P(l, n):
    from math import sqrt
    m = sqrt(n)
    for x in l:
        if x <= m:
            if n % x == 0:
                return
        else:
            break
    l.append(n)

R = []
for i in range(2, 1000000):
    P(R, i)
print R

#5


引用 4 楼 bugs2k 的回复:
Python code?123456789101112131415def P(l, n):    from math import sqrt    m = sqrt(n)    for x in l:        if x <= m:            if n % x == 0:                return        else:        ……

太牛了,这个效率很高呀

#6


算法就基本是#4这样了
但程序还可以微调再优化
例如
在2之后n为偶数就没必要扔进def了
每位的数字和是3的倍数,该数也是3的倍数,例如27:2+7=9
在5后个位为5/0也是
还有其他一些排除规律
……
也可以完全用上述排除法得出质数列的,记得好像叫试除法?忘了

import也应该挪出函数外,虽然py只有第一次调用import,但后面每次def内都要检查一次的,降低效率

#7


其实没有必要import math的,
算sqrt用 “num**0.5” 就行,4楼的或者写成x*x<=n也行

#8


昨晚google了一下,排除法应该叫“筛除法”,不是试除法
写了一个,但水平不高,测试比#4慢一百倍,瓶颈在生成器和sort(),但也没想到优化方法
但思路是这样的,每添加一个质数,就把其倍数在原数列中排除,剩下的数列最小的一个就是质数


    q = list(range(2, 10000))
    l = []

    while 1:
        if len(q) <= 2:
            l.extend(q)
            break
        else:
            qs = q.pop(0)
            l.append(qs)
            qm = q[len(q) - 1]
            q1 = set(qs * n for n in range(2, int(qm / qs) + 1))
            q = list(set(q) - q1)
            q.sort()

    print(l)

#9


from math import sqrt
from datetime import datetime, timedelta

def P(l, n):
    m = sqrt(n)
    for x in l:
        if x > m:
            break
        if n % x == 0:
            return
    l.append(n)

def Run(F, M):
    R = []
    tStart = datetime.now()
    for i in range(2, M):
        F(R, i)
    tEnd = datetime.now()
    tDelta = tEnd - tStart
    print tDelta
    L = len(R)
    print L, R[0 : L if L < 10 else 10]

M = 1000000
Run(P, M)

有没有更快一点的?

#10


你把tStart = datetime.now()放在 import 前和后比较一下
参考#7建议

引用 9 楼 bugs2k 的回复:
Python code?12345678910111213141516171819202122232425from math import sqrtfrom datetime import datetime, timedelta def P(l, n):    m = sqrt(n)    for x in l:        if x > m:            b……

#11



from time import time
t0=time()

def prime(n):
    return reduce(lambda x,y: [i for i in x if i%y!=0 or i==y], range(2,int(n**0.5)+1),range(2,n+1))

print len(prime(10**5))
print time()-t0


这个算是简洁和效率比较平衡的方法,比lz的快了不少,但没有@bugs2k的快

#12



n = 1000000
a = [True] * (n + 1)
b = []
for i in range(2, int(n ** 0.5) + 1):
    if a[i]:
        for j in range(i, int(n / i) + 1):
            a[j * i] = False
for i in range(2, n + 1):
    if a[i]:
        b.append(i)
print(b)

结合筛除法和开方
不会array,我水平到此为止了, 写不出更好的了

#13


楼上这个不错,简单优化一下...
a = [True] * (n + 1)
b = [2]
for i in range(3, int(n ** 0.5) + 1, 2):
    if a[i]:
        for j in range(i*i, n + 1, i):
            a[j] = False
for i in range(3, n + 1, 2):
    if a[i]:
        b.append(i)

#14


谢谢,步长为2意思是奇数数列么?呵呵,少一半循环……

引用 13 楼 angel_su 的回复:
楼上这个不错,简单优化一下...Python code?123456789a = [True] * (n + 1)b = [2]for i in range(3, int(n ** 0.5) + 1, 2):    if a[i]:        for j in range(i*i, n + 1, i):            a[j] = Falsefor i in ……

#15


嗯,是仅处理奇数列,貌似还不够完善,内层循环再改一下for j in range(i*i, n + 1, i *2)

#1


F = lambda i, n: i if 0 in [n % x for x in i] else i + [n]
R = []
for i in range(2, 100):
    R = F(R, i)
print R


def Fi(i, n):
    res = [n % x for x in i]
    if 0 in res:
        return i
    else:
        return i + [n]
R = []
for i in range(2, 100):
    R = Fi(R, i)
print R


#2


引用 1 楼 bugs2k 的回复:
Python code?12345F = lambda i, n: i if 0 in [n % x for x in i] else i + [n]R = []for i in range(2, 100):    R = F(R, i)print R
Python code?12345678910def Fi(i, n):    res = [n % x for x ……

谢谢,很强大!
另外,想知道这个算法还能不能再优化呢,就是减少判断次数,类似从n/2到sqrt(n)

#3


def F(l, n):
    for x in l:
        if n % x == 0:
            return
    l.append(n)

def P(l, n):
    from math import sqrt
    m = sqrt(n)
    for x in l:
        if (x <= m) and (n % x == 0):
            return
    l.append(n)

R = []
for i in range(2, 100):
    P(R, i)
print R

不知道F和P,谁更快?

#4


def P(l, n):
    from math import sqrt
    m = sqrt(n)
    for x in l:
        if x <= m:
            if n % x == 0:
                return
        else:
            break
    l.append(n)

R = []
for i in range(2, 1000000):
    P(R, i)
print R

#5


引用 4 楼 bugs2k 的回复:
Python code?123456789101112131415def P(l, n):    from math import sqrt    m = sqrt(n)    for x in l:        if x <= m:            if n % x == 0:                return        else:        ……

太牛了,这个效率很高呀

#6


算法就基本是#4这样了
但程序还可以微调再优化
例如
在2之后n为偶数就没必要扔进def了
每位的数字和是3的倍数,该数也是3的倍数,例如27:2+7=9
在5后个位为5/0也是
还有其他一些排除规律
……
也可以完全用上述排除法得出质数列的,记得好像叫试除法?忘了

import也应该挪出函数外,虽然py只有第一次调用import,但后面每次def内都要检查一次的,降低效率

#7


其实没有必要import math的,
算sqrt用 “num**0.5” 就行,4楼的或者写成x*x<=n也行

#8


昨晚google了一下,排除法应该叫“筛除法”,不是试除法
写了一个,但水平不高,测试比#4慢一百倍,瓶颈在生成器和sort(),但也没想到优化方法
但思路是这样的,每添加一个质数,就把其倍数在原数列中排除,剩下的数列最小的一个就是质数


    q = list(range(2, 10000))
    l = []

    while 1:
        if len(q) <= 2:
            l.extend(q)
            break
        else:
            qs = q.pop(0)
            l.append(qs)
            qm = q[len(q) - 1]
            q1 = set(qs * n for n in range(2, int(qm / qs) + 1))
            q = list(set(q) - q1)
            q.sort()

    print(l)

#9


from math import sqrt
from datetime import datetime, timedelta

def P(l, n):
    m = sqrt(n)
    for x in l:
        if x > m:
            break
        if n % x == 0:
            return
    l.append(n)

def Run(F, M):
    R = []
    tStart = datetime.now()
    for i in range(2, M):
        F(R, i)
    tEnd = datetime.now()
    tDelta = tEnd - tStart
    print tDelta
    L = len(R)
    print L, R[0 : L if L < 10 else 10]

M = 1000000
Run(P, M)

有没有更快一点的?

#10


你把tStart = datetime.now()放在 import 前和后比较一下
参考#7建议

引用 9 楼 bugs2k 的回复:
Python code?12345678910111213141516171819202122232425from math import sqrtfrom datetime import datetime, timedelta def P(l, n):    m = sqrt(n)    for x in l:        if x > m:            b……

#11



from time import time
t0=time()

def prime(n):
    return reduce(lambda x,y: [i for i in x if i%y!=0 or i==y], range(2,int(n**0.5)+1),range(2,n+1))

print len(prime(10**5))
print time()-t0


这个算是简洁和效率比较平衡的方法,比lz的快了不少,但没有@bugs2k的快

#12



n = 1000000
a = [True] * (n + 1)
b = []
for i in range(2, int(n ** 0.5) + 1):
    if a[i]:
        for j in range(i, int(n / i) + 1):
            a[j * i] = False
for i in range(2, n + 1):
    if a[i]:
        b.append(i)
print(b)

结合筛除法和开方
不会array,我水平到此为止了, 写不出更好的了

#13


楼上这个不错,简单优化一下...
a = [True] * (n + 1)
b = [2]
for i in range(3, int(n ** 0.5) + 1, 2):
    if a[i]:
        for j in range(i*i, n + 1, i):
            a[j] = False
for i in range(3, n + 1, 2):
    if a[i]:
        b.append(i)

#14


谢谢,步长为2意思是奇数数列么?呵呵,少一半循环……

引用 13 楼 angel_su 的回复:
楼上这个不错,简单优化一下...Python code?123456789a = [True] * (n + 1)b = [2]for i in range(3, int(n ** 0.5) + 1, 2):    if a[i]:        for j in range(i*i, n + 1, i):            a[j] = Falsefor i in ……

#15


嗯,是仅处理奇数列,貌似还不够完善,内层循环再改一下for j in range(i*i, n + 1, i *2)