可以使用Python代码填充列表,但是在R

时间:2019-03-25 11:20:23

标签: python r for-loop

从给定输入向量中获取一个包含质数的向量。在Python中工作,其中我将输入列表中的每个质数附加到一个空列表中,但是在R中没有获得正确的输出

Python代码:

def get_prime(input_list):
    output_list = []
    for num in input_list:
        for i in range(2, num):
                if num%i == 0:
                    break
        else:   
            output_list.append(num)
    return output_list

输出:

get_prime([3,4,5,6,7,8])
[3, 5, 7]

R代码:

get_prime <- function(input_number_vector){
  prime = c()
  for(num in input_number_vector){
    for(div in 2:(num-1)){ if(num %% div == 0) break 
                           else prime = c(prime,num)
                                                   }
    }
  prime
}

输出:

x <- c(3,4,5,6,7,8)
> get_prime(x)
[1] 3 5 5 5 7 7 7 7 7

预期输出:

3,5,7

看起来像奇数:3、5、7每次模态条件检查都附加一次。即3次,除数为2,5次三次,除数为2,3,4,7为除数2,3,4,5,6。 有人可以让我知道我要去哪里了,以及R在这方面的工作方式是否不同于Python。

2 个答案:

答案 0 :(得分:1)

for..else Python唯一的结构。您在说的是if,我们不会在for中打断,我们附上。 R没有这样的构造,因此elseif匹配。您似乎在这里也将Python语法的空间规则解释为相同,这再次是一件独特的Python。我知道,遇到if...else的任何其他语言都将一起解释它们,而无论它们之间是否有换行符/空格,这都是您可能没有想到的。

没有特殊的Python构造的最简单方法是在循环is_prime<-1之前使用一个标志,如果没有,则将其设置为0。然后退出,进行循环检查if(is_prime),如果是,则追加。修改外循环的主体会导致:

is_prime<-TRUE
for(div in 2:(num-1)) {
    if(num %% div == 0) {
        is_prime<-FALSE
        break 
    }
}
if (is_prime) prime = c(prime,num)

答案 1 :(得分:0)

显然有更好的方法进行编码,但是就调试您的代码而言,这里有一些观察结果。

Python代码中的

elseif块之外,而在R代码中,它与if处于同一级别。在Python is permitted中使else像这样,而R中不允许这样做。如果尝试在R中使用相同的东西,则会出错。 (同样,我的意思是拥有else而没有if)。

另一点是,只有当prime用尽时,才检查是否在2:(num-1)中添加数字。结合这两个更改,我们可以将您的函数编写为

get_prime <- function(input_number_vector){
   prime = c()
   for(num in input_number_vector){
     for(div in 2:(num-1)){ 
       if(num %% div == 0) break 
     }
     if (div == num - 1)
        prime = c(prime,num)
     }
     prime
 } 

x <- c(3,4,5,6,7,8)
get_prime(x)
#[1] 3 5 7