【问题标题】:My function to filter out prime numbers is printing duplicates, how can I fix this?我过滤素数的功能是打印重复项,我该如何解决?
【发布时间】:2021-02-11 04:46:01
【问题描述】:

这就是我所拥有的。该函数在过滤出合数时效果很好,但我不知道为什么它会打印某些数字的重复项:

def prime_filter(list):
    prime_list = []
    for i in list:
        if i == 2:
            prime_list.append(i)
        if i > 1:
            for n in range(2, i):
                if(i % n == 0):
                    break
                else:
                    prime_list.append(i)
    print("The total number of prime numbers is: ", len(prime_list))
    print(prime_list)

这是我对该函数的测试及其返回的输出:

# test
test_list = [2, 3, 6, 8, 11]
prime_filter(test_list)

The total number of prime numbers is:  11
[2, 3, 11, 11, 11, 11, 11, 11, 11, 11, 11]

有人知道我该如何解决这个问题吗?非常感谢任何帮助。

【问题讨论】:

  • 第一件事->不要使用list作为python中的保留函数的变量
  • break 只破坏内部循环
  • 删除for循环内的else部分

标签: python function duplicates


【解决方案1】:

您应该检查 prime_list 是否除以所有数字。

def prime_filter(list):
    prime_list = []
    for i in list:
        if i == 2:
            prime_list.append(i)
        if i > 2:
            for n in range(2, i):
                if(i % n == 0):
                    break
            else:
                prime_list.append(i)
                
    print("The total number of prime numbers is: ", len(prime_list))
    print(prime_list)

【讨论】:

    【解决方案2】:

    i>1 的代码中,i 的每个值都被附加为 odd no%2==1,这使得程序进入 else 部分。

    另外,你只需要在使用 for 循环时添加 else 部分,没有值除以 i

    这里是改进的工作代码

    def prime_filter(_list):
        prime_list = []
        for i in _list:
            if i == 2:
                prime_list.append(i)
            elif i==1:
                continue
            elif i > 2:
                for n in range(2, i):
                    if(i % n == 0):
                        break
                else:
                    prime_list.append(i)
        print("The total number of prime numbers is: ", len(prime_list))
        print(prime_list)
    
    test_list = [2, 3, 6, 8, 11]
    prime_filter(test_list)
    # output [2,3,11]
    

    how to check a no is prime or not

    【讨论】:

      【解决方案3】:

      这可能适用于解决方案。完成所有检查后,应将i 添加到prime_list

      def prime_filter(list):
          prime_list = []
          for i in list:
              if i == 2:
                  prime_list.append(i)
              if i > 1:
                  for n in range(2, i):
                      if(i % n == 0):
                          break
                      if n**2>i:
                          prime_list.append(i)
                          break
          print("The total number of prime numbers is: ", len(prime_list))
          print(prime_list)
      

      【讨论】:

      • 这就是所谓的Sieve of Eratosthenes算法。
      • 非常感谢!
      【解决方案4】:

      您的代码无法正确获取素数,它会将所有未除以 2 的数字相加,例如如果列表中有 9 个,它将包含在 prime_list 中。我想提出以下建议:

      def prime_filter(list):
      prime_list = []
      for i in list:
          if i == 2:
              prime_list.append(i)
          if i > 2:
              prime_flag = True
              for n in range(2, i):
                  if i % n == 0:
                      prime_flag = False
                      break
      
              if prime_flag:
                  prime_list.append(i)
      print("The total number of prime numbers is: ", len(prime_list))
      print(prime_list)
      

      test_list = [2, 3, 6, 8, 9, 11] prime_filter(test_list)

      素数的总数是:3

      [2, 3, 11]

      【讨论】:

      • funfact 你可以在for循环之后使用else,因为不需要检查条件是否满足
      • 你说得对,不过我想更直观的展示给大家看,谢谢。
      【解决方案5】:

      sahasrara62 和 Abhinav 的答案当然是正确的,但我想在这里指出奇怪的低效率。复合n的最大因子最多是sqrt(n),这样可以省去很多内循环的迭代。

      另一个优化是避免检查偶数因子 - 我们已经知道值是奇数

      def prime_filter(lst):
          prime_list = [value for value in lst
                        if (not value % 2 
                            or any(not value % n for n in range(3, value**.5 + 1, 2))
                           )]
      

      可以通过在检查因素之前添加快速primality test来进一步改进

      【讨论】:

      • 为了提高效率,我会推荐埃拉托色尼筛。但是 OP 需要找出错误而不是提高它的速度/复杂性
      • @AbhinavMathur SE 是一个稍微不同的东西,它会找到所有小于给定素数的素数。这里我们只看素数测试,这是另一回事。
      • 对大量查询的素数测试变得比 SE 效率低得多,它取决于要测试的数字的顺序
      • @AbhinavMathur 是的,空间与计算复杂度的权衡。但与 RAM 容量不同的是,CPU 时间(可能)是无限的
      • 取决于使用情况。如果预期用途是用于竞争性编程,那么在大多数情况下,时间远比空间重要
      【解决方案6】:
      else:
          prime_list.append(i)
      

      对于每个不划分i 的因素,它将被附加到列表中,这是不正确的。只需将功能更改为

      def prime_filter(lst):
          prime_list = []
          for i in lst:
              isprime = 1
              if i == 2:
                  prime_list.append(i)
              else if i > 1:
                  for n in range(2, i):
                      if(i % n == 0):
                          isprime = 0
                          break
                  if isprime:
                      prime_list.append(i)
          print("The total number of prime numbers is: ", len(prime_list))
          print(prime_list)            
      

      【讨论】:

      • 非常感谢!
      猜你喜欢
      • 2022-01-11
      • 2017-04-22
      • 2011-09-08
      • 1970-01-01
      • 2022-01-19
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2022-08-13
      相关资源
      最近更新 更多