Lua如何从table中分离重复、非重复键值对至对应新表
Lua表按值重复度拆分实现方案
首先先指出你给出的原始代码的两个问题:
- 语法错误:Lua表构造规则中,带引号的字符串作为键时,必须放在方括号内,正确写法是
['item1'] = 6,直接写'item1' = 6无法运行 - 结构限制:普通Lua键值表不允许存在重复键,你写了两次
item5键,即使修正语法,后写入的item5 = 3会覆盖之前的item5 = 2,最终表中只会保留一个item5字段,无法匹配你给出的预期输出。如果你的业务场景确实需要同一个键对应多个值,需要用数组嵌套结构存储键值对,下面会给出两种场景的实现代码。
场景1:普通唯一键值表(无重复键)
这是最常用的Lua表场景,所有键唯一,仅按值的出现次数拆分:值出现≥2次的键值对存入repeated,值仅出现1次的存入notrepeated。
实现代码
-- 正确写法的示例原始表,替换成你的实际业务数据即可 local tbl = { item1 = 6, item2 = 1, item3 = 6, item4 = 3, item5 = 2, item6 = 3 -- 原代码重复写了item5,这里修正为唯一键,可自行替换 } local repeated = {} local notrepeated = {} local valueCount = {} -- 第一次遍历:统计每个值的出现频次 for _, v in pairs(tbl) do valueCount[v] = (valueCount[v] or 0) + 1 end -- 第二次遍历:按频次拆分到对应结果表 for k, v in pairs(tbl) do if valueCount[v] > 1 then repeated[k] = v else notrepeated[k] = v end end
运行结果
repeated内容:{item1 = 6, item3 = 6, item4 = 3, item6 = 3},符合重复值存储要求notrepeated内容:{item2 = 1, item5 = 2},和你给出的非重复值预期完全一致
场景2:允许重复键的多映射结构
如果你确实需要存储重复键(比如示例中同一个item5对应2和3两个值),需要把原始数据改成数组嵌套的键值对结构,对应实现代码如下:
-- 多映射结构的原始表,允许重复键 local tbl = { {key = 'item1', value = 6}, {key = 'item2', value = 1}, {key = 'item3', value = 6}, {key = 'item4', value = 3}, {key = 'item5', value = 2}, {key = 'item5', value = 3} } local repeated = {} local notrepeated = {} local valueCount = {} -- 统计值频次 for _, entry in ipairs(tbl) do local v = entry.value valueCount[v] = (valueCount[v] or 0) + 1 end -- 拆分结果 for _, entry in ipairs(tbl) do local k, v = entry.key, entry.value if valueCount[v] > 1 then repeated[k] = v else notrepeated[k] = v end end
运行结果
repeated内容:{item1 = 6, item3 = 6, item4 = 3, item5 = 3},和你给出的预期完全一致notrepeated内容:{item2 = 1, item5 = 2},和你给出的预期完全一致
注意:由于Lua普通表的键唯一,这种场景下如果同一个键对应的值一个是重复值、一个是非重复值,最终结果表里该键会保留最后一次遍历到的值,和你给出的预期效果匹配。
内容的提问来源于stack exchange,提问作者flusk
相关产品推荐
相关产品推荐

