R和python中for循环之间的区别

Ele*_*ena 2 for-loop r

我的函数必须将给定字符串中的所有大写字母转换为小写字母,反之亦然.我曾经用循环来解决这些问题.所以,我的代码是:

mirror_case <- function(x){
   for(i in x){
     ifelse(i==toupper(i),x <- 
       str_replace_all(x,i,tolower(i)),
            ifelse(i==tolower(i),x <- 
       str_replace_all(x,i,toupper(i)),
                  x <- gsub(i,i,x)))}
   return(x)}
Run Code Online (Sandbox Code Playgroud)

我在几个字符串上检查了这个.有时它有效,有时则无效.

> d
[1] "LKJLjlei 33"
> mirror_case(d)
[1] "LKJLjlei 33"

> e
[1] "asddf"
> mirror_case(e)
[1] "ASDDF"

> f
[1] "ASDDF"
> mirror_case(f)
[1] "asddf"
Run Code Online (Sandbox Code Playgroud)

那么,这个功能有什么问题?我不仅希望得到答案,而且还想要解释一下这个问题的一些解释,而不是回到这里与类似的问题.

Yos*_*mer 5

R中的字符串不是像python中那样的序列,不能像这样在for循环中遍历.您应该首先将字符串分解为单个字符.试试这个:

mirror_case <- function(s) {
  # break to characters
  chars <- strsplit(s, '') 
  # apply your ifelse statement to all characters
  mirror_chars <- sapply(chars, function(i) 
    ifelse(toupper(i) == i, tolower(i), toupper(i))) 
  # join back to a string
  mirror_s <- paste(mirror_chars, collapse = "")
  return(mirror_s)
}

mirror_case("LKJLjlei 33")
# [1] "lkjlJLEI 33"
Run Code Online (Sandbox Code Playgroud)

  • 使用`Reduce`(就像任何折叠操作一样)来连接字符串会导致二次时间复杂度而无需编译器优化(Python在某些情况下优化二进制字符串连接,但我不确定R).出于这个原因,Python,Java和许多其他语言都有一个内置的`join`方法用于字符串. (2认同)