2017-08-08 56 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列表中。
最後,使用'+'連接您的列表,而不是將兩個列表合併到另一個列表中。

希望這有助於
公園