You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何展平含异构子列表的列表?R语言实现优化方案探讨

优化方案:从init_list直接生成desired_list

你可以通过简化流程,利用purrr的内置函数直接完成转换,无需额外自定义两个辅助函数,代码更简洁高效:

library(purrr)

vec <- c("A"=1,"B"=2, "A"=1, "B"=4)
vec2 <- c("A2"=1,"B2"=2, "A2"=3, "B2"=4)
init_list <- list(vec=vec, C=1, vec2=vec2)

# 一步生成目标列表
desired_list <- init_list %>%
  imap(function(x, elem_name) {
    if (length(x) > 1) {
      # 按向量的名字分组,去重后拼接成字符串
      split(x, names(x)) %>%
        map(~paste(unique(.), collapse = ", "))
    } else {
      # 单元素项直接保留原命名
      set_names(list(x), elem_name)
    }
  }) %>%
  flatten()

# 输出结果
desired_list
# $A
# [1] "1"
# $B
# [1] "2, 4"
# $A2
# [1] "1, 3"
# $B2
# [1] "2, 4"
# $C
# [1] 1

优化点说明:

  • 用imap同时遍历列表的元素和名字,无需单独处理命名逻辑
  • 对长向量直接用split按名字分组,替代原cluster_by_name的循环逻辑
  • 最后用flatten一键扁平化嵌套列表,替代原flatten_sublist的循环拼接操作
  • 全程逻辑连贯,从原始列表直接生成目标结构,减少中间变量

如果偏好base R实现,也可以用以下代码,无需加载purrr包:

vec <- c("A"=1,"B"=2, "A"=1, "B"=4)
vec2 <- c("A2"=1,"B2"=2, "A2"=3, "B2"=4)
init_list <- list(vec=vec, C=1, vec2=vec2)

process_item <- function(x, item_name) {
  if (length(x) > 1) {
    tapply(x, names(x), function(v) paste(unique(v), collapse = ", "))
  } else {
    structure(list(x), names = item_name)
  }
}

desired_list_base <- unlist(lapply(names(init_list), function(n) process_item(init_list[[n]], n)), recursive = FALSE)

内容的提问来源于stack exchange,提问作者Ferroao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:23:26