Как узнать, является ли массив подмножеством другого массива?

В Python мы можем использовать set или itertools, чтобы найти подмножество одного списка в другом списке, как мы можем сделать то же самое в Lua?

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

Как проверить, что b является подмножеством a?


person Muhammad Lukman Low    schedule 03.02.2015    source источник
comment
Можете ли вы привести пример того, чего вы пытаетесь достичь?   -  person lhf    schedule 03.02.2015


Ответы (1)


Наборы могут быть реализованы в Lua с использованием таблиц в качестве поиска для проверки принадлежности (как это сделано в Программировании на 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

Если a и b должны оставаться в виде массива, то подмножество можно реализовать следующим образом:

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
person ryanpattison    schedule 03.02.2015