如何在R语言的矩阵列表中检测指定Wordle矩阵是否存在?
Wordle提交重复检测的R语言解决方案
你遇到的核心问题是:R的%in%运算符无法直接比较矩阵这类复杂对象的内容是否一致,它只能判断对象引用或简单类型的匹配情况。下面提供几种可行的解决方法,以及更高效的优化方案:
方法1:用identical遍历列表直接比较矩阵
identical()函数可以严格判断两个R对象(包括矩阵)的内容、维度等所有属性是否完全一致。你可以通过sapply()遍历存储矩阵的列表,检查是否存在与新矩阵一致的元素:
# 原始矩阵与列表 wordle_brendan <- rbind(c(1,0,0,0,0),c(2,2,0,0,0),c(2,2,0,0,0),c(2,2,2,2,2)) wordle_jack <- rbind(c(2,0,0,0,0),c(2,2,0,0,0),c(2,2,2,2,2)) wordle_list <- list(wordle_brendan, wordle_jack) # 测试用的重复矩阵 new_brendan <- rbind(c(1,0,0,0,0),c(2,2,0,0,0),c(2,2,0,0,0),c(2,2,2,2,2)) # 检查是否存在重复 any(sapply(wordle_list, function(x) identical(x, new_brendan)))
执行后会返回TRUE,说明新矩阵与列表中的元素重复。
方法2:将矩阵转换为简单类型后比较
把矩阵扁平化为向量或拼接成字符串,就能用%in%快速判断重复:
转成向量的方式
# 将列表中的矩阵全部转为扁平化向量 vector_list <- lapply(wordle_list, as.vector) # 新矩阵转成向量 new_vec <- as.vector(new_brendan) # 检查重复 any(sapply(vector_list, function(x) identical(x, new_vec)))
转成字符串的方式(更适合批量检查)
# 初始化存储字符串的向量,将现有矩阵转为逗号分隔的字符串 wordle_strings <- c( paste(as.vector(wordle_brendan), collapse = ","), paste(as.vector(wordle_jack), collapse = ",") ) # 新矩阵转成字符串 new_str <- paste(as.vector(new_brendan), collapse = ",") # 直接用%in%检查重复 new_str %in% wordle_strings
更优方案:从存储阶段简化类型
如果后续要处理大量提交,建议一开始就把Wordle结果存储为字符串或扁平化向量,而非矩阵。这样每次新增提交时,直接转换为对应类型后用%in%判断,效率更高、代码更简洁:
# 假设新提交的矩阵是new_submission new_sub_str <- paste(as.vector(new_submission), collapse = ",") # 检查并更新存储 if (new_sub_str %in% wordle_strings) { print("该提交已存在") } else { wordle_strings <- c(wordle_strings, new_sub_str) print("提交已记录") }
内容的提问来源于stack exchange,提问作者Liam Brothers
相关产品推荐
相关产品推荐

