リスト `A`にリスト` B`のすべての要素が含まれているかどうかを判断する方法
Aug 24 2020
リストにリスト内のA
すべての要素B
(重複する要素を含む)が含まれているかどうかを確認したいと思います。
たとえば、forA = {1, 1, 1, 3, 3}; B = {1, 1, 1, 3, 3, 3}
はを返す必要がありFalse
ます。
A = {1, 1, 1, 3, 3}; B = {1, 1, 1, 3}
返す必要がありますTrue
。
A = {3, 3, 1, 1, 1}; B = {1, 1, 1, 3}
返す必要がありますTrue
。
A = {3, 3, 1, 1, 4}; B = {1, 1, 4, 4}
返す必要がありますFalse
。
この問題を簡潔に解決するにはどうすればよいですか?
SubsetQ[{3, 3, 1, 1, 4}, {1, 1, 4, 4}](*the result is True, which does not meet the requirements*)
さらに、配列のインデックスを取得する他の方法を知りたいです。
SeedRandom[1234]
RandomSample[Array[x, 10]]
% /. _[x_] :> x(*Besides this method, I would like to know as many methods as possible*)
回答
4 CarlWoll Aug 24 2020 at 07:13
「MultisetInclusionQ」を使用できます:ResourceFunction
ResourceFunction["MultisetInclusionQ"][{1,1,1,3,3},{1,1,1,3,3,3}]
ResourceFunction["MultisetInclusionQ"][{1,1,1,3,3},{1,1,1,3}]
ResourceFunction["MultisetInclusionQ"][{3,3,1,1,1},{1,1,1,3}]
ResourceFunction["MultisetInclusionQ"][{3,3,1,1,4},{1,1,4,4}]
誤り
本当
本当
誤り
5 kglr Aug 24 2020 at 07:20
ClearAll[f]
f = And @@ NonNegative[Subtract @@ (KeyUnion@(Counts /@ {##}) /. _Missing -> 0)] &;
例:
A1 = {1, 1, 1, 3, 3}; B1 = {1, 1, 1, 3, 3, 3};
A2 = {1, 1, 1, 3, 3}; B2 = {1, 1, 1, 3};
A3 = {3, 3, 1, 1, 1}; B3 = {1, 1, 1, 3};
A4 = {3, 3, 1, 1, 4}; B4 = {1, 1, 4, 4};
f @@@ {{A1, B1}, {A2, B2}, {A3, B3}, {A4, B4}}
{False, True, True, False}
Fold+DeleteCasesは次のように使用することもできます。
ClearAll[f2]
f2 = Fold[DeleteCases[#, #2, 1, 1] &, #2, #] === {} &;
f2 @@@ {{A1, B1}, {A2, B2}, {A3, B3}, {A4, B4}}
{False, True, True, False}
質問の2番目の部分について:
SeedRandom[1234]
rs = RandomSample[Array[x, 10]]
{x[1], x[7], x[5], x[6], x[9], x[3], x[10], x[4], x[8], x[2]}
rs[[All, 1]]
{1, 7, 5, 6, 9, 3, 10, 4, 8, 2}
First /@ rs
{1, 7, 5, 6, 9, 3, 10, 4, 8, 2}