填充列表的Python代码有效,但填充向量的类似代码无效';我不能在R工作
从给定的输入向量得到一个由素数组成的向量作为输出。在Python中工作,我将输入列表中的每个素数追加到一个空列表中,但在R中没有得到正确的输出 Python代码:填充列表的Python代码有效,但填充向量的类似代码无效';我不能在R工作,python,r,for-loop,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
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]
x <- c(3,4,5,6,7,8)
> get_prime(x)
[1] 3 5 5 5 7 7 7 7 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
}
看起来像是奇数:3、5、7在每个模数条件检查中追加一次。i、 e.3一次除数为2,5三次除数为2,3,4,7次除数为2,3,4,5,6。
有人能告诉我哪里出了问题,以及在这方面R是否与Python的工作方式不同 显然有更好的方法来编写代码,但就调试代码而言,这里有一些观察结果 Python中的
else
代码在if
块之外,而在R代码中,您以与if
相同的级别表示它。在中使用类似的else
,而在R中不允许使用相同的内容。如果您尝试在R中使用相同的内容,您将得到一个错误。(我所说的同一件事是指有else
而没有if
)
另一点是,只有在prime
已耗尽整个2:(num-1)
时,才必须选中在prime
中添加一个数字。结合这两个变化,我们可以将函数编写为
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
get_primefor..else
是Python特有的结构。您所说的如果
我们没有打断
的,我们将附加R
没有这样的构造,因此else
与if
匹配。您似乎还将Python语法的空格规则解释为在这里是一样的——这也是一个独特的Python东西。我所知道的任何其他语言如果遇到if…else
将一起解释它们,而不考虑它们之间的换行符/间距,这是您意想不到的
在没有特殊Python构造的情况下,最简单的方法是在循环之前使用一个标志,
is\u primer,因为R代码与Python代码做的不一样。它们相似但不完全相同(R代码附加到内部循环中的向量)。每次余数为非零时,您都要更新prime
向量。如果尝试使用一些奇数非素数,此代码将多次打印该数字,因为超过第一个除数的数字从2开始。R使用TRUE
和FALSE
作为逻辑值(不是1
和0
),并且不使用分号。否则很好的解释。@KonradRudolph谢谢我会编辑的。这只是习惯的力量:)。
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
is_prime<-TRUE
for(div in 2:(num-1)) {
if(num %% div == 0) {
is_prime<-FALSE
break
}
}
if (is_prime) prime = c(prime,num)