Filtrare sottolista in Mathematica
-
21-09-2019 - |
Domanda
Sono un utente novizio in matematica. Ecco il mio problema:
Per esempio, ho una lista annidata:
lst = {{1, 0, 0}, {0, 1, 1}, {2, 0, 1}, {1}, {0,3}}
Voglio solo uscita coloro elenco secondario i cui elementi sono 0 o 1. L'uscita di sopra della lista dovrebbe essere:
{{1, 0, 0}, {0, 1, 1}, {1}}
posso ottenere la lista che soddisfa le mie condizioni con questo:
lst /. x:{(1 | 0) ..} :> x
Ma come posso ottenere il contrario del modello? in questo modo:
lst /. x:NOT{(1 | 0) ..} :> Sequence[]
In modo che io possa ottenere il risultato in un colpo solo.
grazie!
Soluzione
Questa è una simpatica applicazione per alcuni / tutti:
some[f_, l_List] := (* whether f applied to some *)
Scan[If[f[#], Return[True]]&, l] === True (* element of list is True. *)
every[f_, l_List] := (* similarly, And @@ f/@l *)
Scan[If[!f[#], Return[False]]&, l]===Null (* (but with lazy evaluation). *)
Quindi, prima fare una funzione che controlla un elenco secondario per tutti zeri / quelli:
chk[lst_] := every[#==0||#==1&, lst]
Poi filtrare l'elenco-of-liste per sottoliste che passano il test:
Select[lst, chk]
In alternativa, come un one-liner:
Select[lst, every[#==0||#==1&, #]&]
Altri suggerimenti
A partire da:
lst = {{1, 0, 0}, {0, 1, 1}, {2, 0, 1}, {1}, {0, 3}};
È possibile filtrare con questo:
Cases[lst, {(1 | 0) ..}]
O ottenere il complemento sia con:
Cases[lst, Except @ {(1 | 0) ..} ]
o
DeleteCases[lst, {(1 | 0) ..}]