Filtrer les sous-liste dans Mathematica
-
21-09-2019 - |
Question
Je suis un utilisateur débutant dans Mathematica. Voici mon problème:
Par exemple, j'ai une liste imbriquée:
lst = {{1, 0, 0}, {0, 1, 1}, {2, 0, 1}, {1}, {0,3}}
Je veux que la sortie les sous-liste dont les éléments sont 0 ou 1. La sortie de la liste ci-dessus doit être:
{{1, 0, 0}, {0, 1, 1}, {1}}
Je peux obtenir la liste qui satisfait mes conditions avec ceci:
lst /. x:{(1 | 0) ..} :> x
Mais comment puis-je obtenir l'inverse du modèle? comme ceci:
lst /. x:NOT{(1 | 0) ..} :> Sequence[]
Alors que je peux obtenir le résultat d'un seul coup.
merci!
La solution
Ceci est une application agréable pour certains / tous:
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). *)
Alors d'abord une fonction qui vérifie une sous-liste pour tous les zéros / les:
chk[lst_] := every[#==0||#==1&, lst]
Puis filtrer votre liste-de-listes pour les sous-listes qui passent le test:
Select[lst, chk]
Ou, comme une seule ligne:
Select[lst, every[#==0||#==1&, #]&]
Autres conseils
A partir de:
lst = {{1, 0, 0}, {0, 1, 1}, {2, 0, 1}, {1}, {0, 3}};
Vous pouvez filtrer avec ceci:
Cases[lst, {(1 | 0) ..}]
Ou procurez-vous le complément soit:
Cases[lst, Except @ {(1 | 0) ..} ]
ou
DeleteCases[lst, {(1 | 0) ..}]