【问题标题】:Program to iterate through lists within a list程序遍历列表中的列表
【发布时间】:2020-12-16 03:48:39
【问题描述】:

我有一个列表,其中包含许多包含字符向量的列表。列表总是这样排列,第一个列表包含一个包含单个元素的向量,第二个列表包含一个包含两个元素的向量,第三个包含一个或多个包含三个元素的向量。

fruits <- list(
  list(c("orange")),
  list(c("pear", "orange")),
  list(c("orange", "pear", "grape"),
       c("orange", "lemon", "pear"))
)

我需要遍历列表以便从前一个列表中的向量中删除元素。即我会首先从第一个列表('orange')中的向量中找到值并将其从第二个列表中的向量中删除,然后从第二个列表中获取值(“pear”,“orange”)并删除它们来自第三个列表中的两个向量,所以我最终得到:

new_fruits <- list(
  list(c("orange")),
  list(c("pear")),
  list(c("grape"),
       c("lemon"))
)

我应该补充一点,我已经尝试过这样做,但是我发现列表中的列表使它变得非常复杂,而且我的解决方案很长而且效率不高。

【问题讨论】:

    标签: r


    【解决方案1】:

    也许你可以试试下面的代码

    new_fruits <- s <- c()
    for (k in seq_along(fruits)) {
      new_fruits[[k]] <- lapply(fruits[[k]],function(x) x[!x%in%s])
      s <- union(s,unlist(fruits[[k]]))
    }
    

    给了

    > new_fruits
    [[1]]
    [[1]][[1]]
    [1] "orange"
    
    
    [[2]]
    [[2]][[1]]
    [1] "pear"
    
    
    [[3]]
    [[3]][[1]]
    [1] "grape"
    
    [[3]][[2]]
    [1] "lemon"
    

    【讨论】:

    • 这很棒,也适用于我遇到的第一个列表丢失的少数情况。干杯
    【解决方案2】:

    这是一个想法,我们取消列表,转换为字符串并重新拆分以区分同一元素的不同向量。然后我们再次取消列出并获得唯一值,即

    as.list(unique(unlist(strsplit(unlist(lapply(fruits, function(i) sapply(i, toString))), ', '))))
    
    #[[1]]
    #[1] "orange"
    
    #[[2]]
    #[1] "pear"
    
    #[[3]]
    #[1] "grape"
    
    #[[4]]
    #[1] "lemon"
    

    【讨论】:

    • 谢谢。我需要一段时间才能弄清楚这里发生了什么!
    • 解释应该让你开始。把它拆开,一块一块地运行(当然是从里到外)
    【解决方案3】:

    另外两个紧凑的选项:

    > mapply(fruits,append(list(list("")),fruits[-length(fruits)], after = length(fruits)), FUN = function(x,y) sapply(x,function(item)list(setdiff(item,y[[1]]))))
    [[1]]
    [[1]][[1]]
    [1] "orange"
    
    
    [[2]]
    [[2]][[1]]
    [1] "pear"
    
    
    [[3]]
    [[3]][[1]]
    [1] "grape"
    
    [[3]][[2]]
    [1] "lemon"
    

    也可以

    > append(fruits[[1]],mapply(fruits[-1],fruits[-length(fruits)], FUN = function(x,y) sapply(x,function(item)list(setdiff(item,y[[1]])))), after = length(fruits))
    [[1]]
    [1] "orange"
    
    [[2]]
    [[2]][[1]]
    [1] "pear"
    
    
    [[3]]
    [[3]][[1]]
    [1] "grape"
    
    [[3]][[2]]
    [1] "lemon"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-18
      • 2018-10-07
      • 2022-01-04
      • 2016-08-27
      • 2011-09-14
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多