Come giudicare se la lista "A" contiene tutti gli elementi della lista "B"

Aug 24 2020

Voglio determinare se un elenco Acontiene tutti gli elementi nell'elenco B(inclusi gli elementi duplicati).

Ad esempio, per A = {1, 1, 1, 3, 3}; B = {1, 1, 1, 3, 3, 3}dovrebbe tornare False.

Perché A = {1, 1, 1, 3, 3}; B = {1, 1, 1, 3}dovrebbe tornare True.

Perché A = {3, 3, 1, 1, 1}; B = {1, 1, 1, 3}dovrebbe tornare True.

Perché A = {3, 3, 1, 1, 4}; B = {1, 1, 4, 4}dovrebbe tornare False.

Cosa posso fare per risolvere questo problema in modo sintetico?

SubsetQ[{3, 3, 1, 1, 4}, {1, 1, 4, 4}](*the result is True, which does not meet the requirements*)

Inoltre, mi piacerebbe sapere quali altri modi per ottenere l'indice di un array:

SeedRandom[1234]
RandomSample[Array[x, 10]]
% /. _[x_] :> x(*Besides this method, I would like to know as many methods as possible*)

Risposte

4 CarlWoll Aug 24 2020 at 07:13

Puoi utilizzare "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}]

Falso

Vero

Vero

Falso

5 kglr Aug 24 2020 at 07:20
ClearAll[f]
f = And @@ NonNegative[Subtract @@ (KeyUnion@(Counts /@ {##}) /. _Missing -> 0)] &;

Esempi:

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}

Puoi anche usare Fold+ DeleteCasescome segue:

ClearAll[f2]
f2 = Fold[DeleteCases[#, #2, 1, 1] &, #2, #] === {} &;

f2 @@@ {{A1, B1}, {A2, B2}, {A3, B3}, {A4, B4}}
 {False, True, True, False}

Per la seconda parte della domanda:

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}