2017-08-08 52 views
0

我想从R到Python重写我自己的“素数”函数。在R看起来像这样:从R到Python的素数函数

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],[[[[[[[[[[[[[11],13],17],19],23],29],31] ],41],43],47]]

没有打印和清单是以一种奇怪的方式给我。在我看来,Python中的列表并不像R中的向量那么容易和灵活。

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

+6

一开始尝试'结果+ = [P]'?或'result.append(p)'? –

+0

请注意,result = [result,p]结果var的行尚未定义。然后它变成一个列表,然后你在一个列表中对它进行叠加,从而给出一个列表的列表。然后你在列表中叠加列表列表......等等等等。 @BenBolker提供了一个很好的提示 – Adonis

+0

正如@BenBolker所说,你需要在现有的列表上继续构建,而不是嵌套新的列表。 –

回答

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提到的,你应该实例结果为空列表,而不是作为值无。
然后使用追加(p)将素数添加到质数> 7列表中。
最后,使用'+'连接您的列表,而不是将两个列表合并到另一个列表中。

希望这有助于
公园