【问题标题】:Python code to populate a list works, but similar code to populate a vector doesn't work in R填充列表的 Python 代码有效,但填充向量的类似代码在 R 中不起作用
【发布时间】:2019-03-25 11:20:22
【问题描述】:

从给定的输入向量中获取一个由素数组成的向量作为输出。在 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 不同。

【问题讨论】:

  • R 代码与 Python 代码完全不同。它们相似但不相同(R 代码附加到内部循环内的向量)。
  • 每次余数不为零时,您都会更新prime 向量。如果您尝试使用一些奇数的非质数,此代码将多次打印该数字,因为从 2 开始,超过第一个除数的数字越多。

标签: python r for-loop


【解决方案1】:

for..else 是一个非常Python 独有的结构。您所说的 if 我们不会在 for 中中断,我们会追加。 R 没有这样的结构,因此 elseif 匹配。您似乎也在这里将 Python 语法的空格规则解释为相同 - 这又是一个独特的 Python 事物。我知道遇到if...else 的任何其他语言都会将它们一起解释,而不管它们之间的换行符/间距如何,这是您可能没有预料到的。

不使用特殊 Python 构造的最简单方法是在循环前使用标志 is_prime&lt;-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)

【讨论】:

  • R 使用TRUEFALSE 作为逻辑值(不是10),并且不使用分号。否则很好的解释。
  • @KonradRudolph 谢谢我会编辑。这只是习惯的力量:)。
【解决方案2】:

显然有更好的方法来编写代码,但就调试代码而言,这里有一些观察。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多