如何判断一个数组是否为另一个数组的子集?

在 Python 中,我们可以使用 set 或 itertools 找到另一个列表的一个列表的子集,那么我们在 Lua 中如何做到相同的效果?

a = {1,2,3}
b = {2,3}

我如何检查 b 是 a 的子集?

点赞
用户2726734
用户2726734

在 Lua 中,可以使用表( table )来实现集合,用于成员测试( 在《Lua 编程》中实现)。表中的键是集合的元素,而值是 true,如果元素属于集合,则是 nil

a = {[1]=true, [2]=true, [3]=true}
b = {[2]=true, [3]=true}

-- Or create a constructor
function set(list)
   local t = {}
   for _, item in pairs(list) do
       t[item] = true
   end
   return t
end

a = set{1, 2, 3}
b = set{2, 3}

在这种形式下编写集合操作也很简单( 如此)。

function subset(a, b)
   for el, _ in pairs(a) do
      if not b[el] then
         return false
      end
    end
   return true
end

print(subset(b, a)) -- true
print(subset(set{2, 1}, set{2, 2, 3, 1})) -- true

a[1] = nil -- remove 1 from a
print(subset(a, b)) -- true

如果 ab 必须保持为数组形式,那么可以这样实现 subset:

function arraysubset(a, b)
   local s = set(b)
   for _, el in pairs(a) -- changed to iterate over values of the table
      if not s[el] then
         return false
      end
   end
   return true
end
2015-02-03 15:31:29