Filtre a sublista em Mathematica
-
21-09-2019 - |
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!
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