【问题标题】:How to get the complement of two Lua tables如何获得两个 Lua 表的补码
【发布时间】:2013-03-06 22:22:42
【问题描述】:

在 Lua v. 5.2 中,我怎样才能得到两个表的键都是字符串的补码?

理想情况下,我想要一个类似的函数:

    table.complement ( t1, t2 )

... 其中返回的是一个表,它是表 1 和表 2 中键/值对的补集。也就是说,返回的表仅包含两个表中都不存在的键。

让我眼前一亮的用例是 NoteCase Pro 大纲的脚本,它将在执行将当前节点拆分为多个兄弟节点的操作之前获取唯一兄弟节点 ID 的“之前”列表(每个 22 个字符)节点,获取兄弟节点 ID 的新“后”列表,将该列表缩减为两个列表的补集,然后将新创建的节点降级为子节点或层次结构中的原始当前节点。

【问题讨论】:

  • 能否详细说明key-value的补全?
  • “补充”?你的意思是 t1 set-minus t2?
  • 已编辑以使其更清晰。我的意思是 both 表中不存在的一组键/值对,即新创建的节点的 ID。
  • 通常称为“对称差”。

标签: lua lua-table


【解决方案1】:
local function symm_diff(t1, t2)
  local t = {}
  for k, v in pairs(t1) do
    if t2[k] == nil then t[k] = v end
  end
  for k, v in pairs(t2) do
    if t1[k] == nil then t[k] = v end
  end
  return t
end

【讨论】:

  • 谢谢大家,我已经选择了适合我的 Egor 解决方案。我也感谢他提供了急需的词汇课。
【解决方案2】:

没有任何理由你不能自己写这个……像这样的东西?

function table.complement(t1, t2)
    local res = {}

    for _,v1 in pairs(t1) do
        local found = false
        for _,v2 in pairs(t2) do
            if (v1 == v2) then
                found = true
                break
            end
        end
        if not found then table.insert(res, v1) end
    end

    for _,v2 in pairs(t2) do
        local found = false
        for _,v1 in pairs(t1) do
            if (v2 == v1) then
                found = true
                break
            end
        end
        if not found then table.insert(res, v2) end
    end

    return res
end

local t1 = {"stuff", "more", "things"}
local t2 = {"stuff", "junk", "things"}

table.foreach(table.complement(t1, t2), print)

打印出来的

1    more
2    junk

【讨论】:

  • table.foreach 在 Lua 5.1 中已弃用,在 Lua 5.2 中不存在。
  • 是的,它很方便,所以我用它来测试sn-ps。
猜你喜欢
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
  • 2011-07-07
  • 2021-10-06
  • 2021-05-28
  • 2016-12-19
相关资源
最近更新 更多