从给定输入向量中获取一个包含质数的向量。在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。
答案 0 :(得分:1)
for..else
是 Python唯一的结构。您在说的是if
,我们不会在for
中打断,我们附上。 R
没有这样的构造,因此else
与if
匹配。您似乎在这里也将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代码中的 else
在if
块之外,而在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