Filtern sublist in Mathematica
-
21-09-2019 - |
Frage
Ich bin ein Neuling Benutzer in Mathematica. Hier ist mein Problem:
Zum Beispiel, ich habe eine verschachtelte Liste:
lst = {{1, 0, 0}, {0, 1, 1}, {2, 0, 1}, {1}, {0,3}}
Ich will nur dann ausgegeben jene sublist dessenderen Elemente 0 oder 1. Die Ausgabe der oben aufgeführte Liste sollte sein:
{{1, 0, 0}, {0, 1, 1}, {1}}
Ich kann die Liste bekommen, dass mit diesem meinen Bedingungen erfüllt:
lst /. x:{(1 | 0) ..} :> x
Aber wie kann ich die Umkehrung des Musters erhalten? wie folgt aus:
lst /. x:NOT{(1 | 0) ..} :> Sequence[]
So dass ich das Ergebnis in einem Schlag bekommen.
Danke!
Lösung
Dies ist eine nette Anwendung für einige / alle:
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). *)
macht also zuerst eine Funktion, die prüft eine Unterliste für alle Nullen / Einsen:
chk[lst_] := every[#==0||#==1&, lst]
Dann filtern Sie die Liste-of-Listen für die Unterlisten, die den Test bestehen:
Select[lst, chk]
Oder als Einzeiler:
Select[lst, every[#==0||#==1&, #]&]
Andere Tipps
Beginnend mit:
lst = {{1, 0, 0}, {0, 1, 1}, {2, 0, 1}, {1}, {0, 3}};
Sie können mit diesem Filter:
Cases[lst, {(1 | 0) ..}]
Oder bekommt die Ergänzung mit entweder:
Cases[lst, Except @ {(1 | 0) ..} ]
oder:
DeleteCases[lst, {(1 | 0) ..}]