代码之家  ›  专栏  ›  技术社区  ›  jxie0755

Python素数列表

  •  -2
  • jxie0755  · 技术社区  · 8 年前

    我试图弄明白为什么这两个片段本质上应该做相同的工作,但不知为什么它们做不到。

    # This create an empty list first.
    # if number qualifies the prime number then append, if not then break.
    
    pnumber1 = []
    for x in range(2, 101):
        for i in range(2, x):
            if x % i == 0:
                break
        else:
            pnumber1.append(x)
    print(pnumber1)
    

    所以我试着用另一种方式玩,我创建了一个所有数字1-100的列表,并删除了不是素数的数字。然后剩下的应该是素数列表。所以我有:

    # note: this code should exclude '2', which is a prime number, I'll worry about that later.
    
    pnumber1b = list(range(3, 101))
    for x in pnumber1b:
        for i in range(2, x):
            if x % i == 0:
                pnumber1b.remove(x)
        else:
            break
    print(pnumber1b)
    

    pumber1b.remove(x)

    好的,如果我这样尝试:

      pnumber1b = list(range(3, 101))
        for x in pnumber1b:
            for i in range(2, x):
                if x % i == 0:
                    pnumber1b.remove(x)
                else:
                    break
    print(pnumber1b)
    

    要更改缩进级别,它仍将返回: list.remove(x): x not in list

    4 回复  |  直到 8 年前
        1
  •  1
  •   ddor254    8 年前

    当然,它不会起作用:以i=2,x=6为例,6不是素数,所以你去掉它。

    当然,最重要的一点是:您不能更改正在迭代的列表!当您从列表中删除项目x时,您的下一次迭代将无效,列表将被损坏!

    如果询问x是否仍在pnumber1b中,请尝试添加另一个:

    pnumber1b = list(range(3, 101))
    pnumber1a = list(range(3, 101))
    for x in pnumber1b:
            for i in range(2, x):
                    if x % i == 0:
                        if x in pnumber1a:
                            pnumber1a.remove(x)
                            break
                        else:
                            continue
    
    print(pnumber1a)
    

    或者只需在remove命令后添加break,因为不需要继续在数字x上运行。

    pnumber1b = list(range(3, 101))
    pnumber1a = list(range(3, 101))
    for x in pnumber1b:
            for i in range(2, x):
                    if x % i == 0:
                        pnumber1a.remove(x)
                        break
    print(pnumber1a)
    
        2
  •  1
  •   Pedro von Hertwig Batista    8 年前

    有一些不明确的行为使第一个代码工作,而第二个代码却没有。

    for 循环执行 else break .

    for i in range(10):
        if i == 11: break  # Condition not reached, loop ends naturally
    else:
        print('Ok!')
    

    但这并不是:

    for i in range(10):
        if i == 5: break
    else:
        print('Ok!')
    

    pnumber1b = list(range(3, 101))
    for x in pnumber1b:
        for i in range(2, x):
            if x % i == 0:
                pnumber1b.remove(x)
        else:
            break
    

    然后它将到达 for i in range(2, x): 其他的 并跳出外部循环,而不检查大多数值。

    其他的 :

    pnumber1b = list(range(3, 101))
    for x in pnumber1b:
        for i in range(2, x):
            if x % i == 0:
                pnumber1b.remove(x)
    print(pnumber1b)
    

    这将失败,因为对于具有多个倍数的数字,它将尝试删除该项两次,并在未找到已删除的项时引发异常。

    然后,您可以添加一个中断,以在找到第一个后停止查找倍数:

    pnumber1b = list(range(3, 101))
    for x in pnumber1b:
        for i in range(2, x):
            if x % i == 0:
                pnumber1b.remove(x)
                break
    print(pnumber1b)
    

    还有这个 除了删除列表项之外 迭代列表时

    有效的方法是创建一个新列表,将非素数添加到该列表中,然后, 之后

    to_remove = []
    pnumber1b = list(range(3, 101))
    for x in pnumber1b:
        for i in range(2, x):
            if x % i == 0:
                to_remove.append(x)
                break
    for r in to_remove:
        pnumber1b.remove(r)
    print(pnumber1b)
    
        3
  •  1
  •   jxie0755    8 年前

    @ddor254

    您的第一组代码不正确,它只会删除偶数。

    我将其更改为:

    pnumber1b = list(range(2, 101))
    pnumber1a = list(range(2, 101))
    for x in pnumber1b:
        for i in range(2, x):
            if x % i == 0:
                if x in pnumber1a:
                    pnumber1a.remove(x)
        else:
            continue
    print(pnumber1a)
    

    现在可以了

        4
  •  1
  •   KimChoJapFan    7 年前

    此方法要求用一些已知的素数值填充数组。添加到列表中的素数越多,检查器将变得越精确。

    def isprime(n):
    if n==0 or n==1: return False
    testlist = [2,3,5,7,9,11]
    
    grand = 0
    
    for test in testlist:
        if n==test: return True
        elif n%test==0: return False
        else: grand += 1
    
    if grand > 0: return True
    else: return False
    

    可以通过以下方式对您有利:

    primearr = []
    for x in xrange(1, 1000000):
        if isprime(x) == True:
            primearr.append(x)
    

    with open('primelist.txt', 'a') as f:
        for prime in primearr:
            f.write('{},'.format(prime))
    

    然后,您可以检查安装了Python的目录以查找文本文档,除非您在文件名中指定了如下目录:

    with open('C:\\Users\\yourname\\Desktop\\primelist.txt', 'a') as f:
    

    我从这个来源获得了第一个10000000个素数: http://www.primos.mat.br/2T_en.html

    primelist = []
    with open('first-ten-million-primes', 'r') as r:
    primes = r.readlines()
    
    for prime in primes:
        for num in prime.split('\t'):
            primelist.append(int(num))
    
    testlist = [2,3,5,7,9,11]
    success, failure = [], []
    
    for prime in primelist:
        grand = 0
        for test in testlist:
            if prime % test == 0 and prime != test: grand += 1
        if grand > 0: failure.append(prime)
        else: success.append(prime)
    
    print('Successes: {}\r\nFailures: {}'.format(len(success), len(failure)))
    

    该输出返回:

    Successes: 10000000
    Failures: 0