Pergunta

Eu sou um usuário novato em Mathematica. Aqui está o meu problema:

Por exemplo, eu tenho uma lista aninhada:

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

Quero produzir apenas aqueles sublistentes cujos elementos são 0 ou 1. A saída da lista acima deve ser:

{{1, 0, 0}, {0, 1, 1}, {1}}

Eu posso obter a lista que satisfaz minhas condições com isso:

lst /. x:{(1 | 0) ..} :> x

Mas como posso conseguir o inverso do padrão? assim:

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

Para que eu possa obter o resultado em um golpe.

obrigado!

Foi útil?

Solução

Este é um bom aplicativo para alguns/todos:

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

Então, primeiro faça uma função que verifique um sublista para todos os zeros/outros:

chk[lst_] := every[#==0||#==1&, lst]

Em seguida, filtre suas listas de lista para sublistas que passam no teste:

Select[lst, chk]

Ou, como uma linha:

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

Outras dicas

Começando com:

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

Você pode filtrar com isso:

Cases[lst, {(1 | 0) ..}]

Ou obtenha o complemento com qualquer:

Cases[lst, Except @ {(1 | 0) ..} ]

ou:

DeleteCases[lst, {(1 | 0) ..}]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top