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

ws0308 2013-01-18 06:26:48
这段代码是求素数的,reduce看起来吃力,要按照同样的算法来做
谢谢各位大神


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

...全文
445 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_su 2013-01-21
  • 打赏
  • 举报
回复
嗯,是仅处理奇数列,貌似还不够完善,内层循环再改一下for j in range(i*i, n + 1, i*2)
ImN1 2013-01-20
  • 打赏
  • 举报
回复
谢谢,步长为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 ……
angel_su 2013-01-20
  • 打赏
  • 举报
回复
楼上这个不错,简单优化一下...
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)
chyanog 2013-01-19
  • 打赏
  • 举报
回复
其实没有必要import math的, 算sqrt用 “num**0.5” 就行,4楼的或者写成x*x<=n也行
ImN1 2013-01-19
  • 打赏
  • 举报
回复
昨晚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)
ImN1 2013-01-19
  • 打赏
  • 举报
回复
算法就基本是#4这样了 但程序还可以微调再优化 例如 在2之后n为偶数就没必要扔进def了 每位的数字和是3的倍数,该数也是3的倍数,例如27:2+7=9 在5后个位为5/0也是 还有其他一些排除规律 …… 也可以完全用上述排除法得出质数列的,记得好像叫试除法?忘了 import也应该挪出函数外,虽然py只有第一次调用import,但后面每次def内都要检查一次的,降低效率
ImN1 2013-01-19
  • 打赏
  • 举报
回复

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,我水平到此为止了, 写不出更好的了
ws0308 2013-01-19
  • 打赏
  • 举报
回复

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的快
ImN1 2013-01-19
  • 打赏
  • 举报
回复
你把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……
bugs2k 2013-01-19
  • 打赏
  • 举报
回复
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)
有没有更快一点的?
ws0308 2013-01-18
  • 打赏
  • 举报
回复
引用 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: ……
太牛了,这个效率很高呀
bugs2k 2013-01-18
  • 打赏
  • 举报
回复
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
bugs2k 2013-01-18
  • 打赏
  • 举报
回复
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,谁更快?
ws0308 2013-01-18
  • 打赏
  • 举报
回复
引用 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)
bugs2k 2013-01-18
  • 打赏
  • 举报
回复
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

37,744

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧