素数从R到Python运行

时间:2017-08-08 13:05:24

标签: python r

我想改写自己的" Prime数字"从R到Python的功能。在R中它看起来像这样:

 prime_numbers <- function(x)
   {
     p <- 2
     result <- NULL
     while (p <= x)
     {
        if (x<3) lp <- c(2) else if (x<5) lp <- c(2,3) else if (x<7) l<- c(2,3,5) else lp <- c(2,3,5,7)
        if (p%%2!=0 && p%%3!=0 && p%%5!=0 && p%%7!=0) result <- c(result,p)
        p <- p+1 
     }
     return(c(lp,result))
  }

它正常工作。我只需要设置一个数字作为参数,它会打印小于这个数字的所有素数。

我在Python中编写了这个函数。

def prime_numbers (x):
   p = 2
   result = None
   while p <= x:
       if x<3:
           lp = 2
       elif x<5:
           lp = [2,3]
       elif x<7:
           lp = [2,3,5]
       else:
           lp = [2,3,5,7]
       if p%2!=0 and p%3!=0 and p%5!=0 and p%7!=0:
           result = [result,p]
       p = p+1
   return [lp,result]

结果接近正确,但是当我使用50作为参数时,我在控制台中收到类似的内容。

[[2,3,5,7],[[[[[[[[[[[None,11],13],17],19],23],29],31],37] ,41],43],47]]

没有打印,列表以奇怪的方式组成。在我看来,Python中的列表并不像R中的向量那样简单灵活。

如何使用尽可能多的类似语法在Python中获得与R相同的效果?

1 个答案:

答案 0 :(得分:3)

这应该这样做:

def prime_numbers(x):
   p = 2
   result = [] # instead of "result = None"
   while p <= x:
       if x<3:
           lp = 2
       elif x<5:
           lp = [2,3]
       elif x<7:
           lp = [2,3,5]
       else:
           lp = [2,3,5,7]
       if p%2!=0 and p%3!=0 and p%5!=0 and p%7!=0:
           result.append(p) # instead of "result = [result, p]"
       p = p+1
   return lp + result # instead of "[lp, result]"

>>> prime_numbers(50)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

与Professor_joykill提到的一样,您应该将结果实例化为空列表,而不是值为None。 然后使用append(p)将素数添加到素数列表中> 7.
最后,您使用“+”连接列表,而不是将两个列表合并到另一个列表中。

希望这有帮助,
科恩