2009-09-03 10 views
4

Je suis un utilisateur débutant en mathematica. Voici mon problème:Filtrer la sous-liste dans Mathematica

Par exemple, j'ai une liste imbriquée:

lst = {{1, 0, 0}, {0, 1, 1}, {2, 0, 1}, {1}, {0,3}} 

Je veux sortie que les sous-liste dont les éléments sont 0 ou 1. La sortie de la liste ci-dessus devrait ê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 la Converse du modèle? comme ceci:

lst /. x:NOT{(1 | 0) ..} :> Sequence[] 

Afin que je puisse obtenir le résultat en un coup.

merci!

Répondre

5

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). *) 

donc 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-of des listes de sous-listes qui passent le test:

Select[lst, chk] 

Ou, comme en une ligne:

Select[lst, every[#==0||#==1&, #]&] 
+4

merci, mec! De votre indice, j'ai une autre solution: Case [lst, {(1 | 0) ..}] – jscoot

6

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) ..}] 
Questions connexes