Filtrar lista secundaria en Mathematica
-
21-09-2019 - |
Pregunta
Soy un usuario novato en Mathematica. Aquí está mi problema:
Por ejemplo, tengo una lista anidada:
lst = {{1, 0, 0}, {0, 1, 1}, {2, 0, 1}, {1}, {0,3}}
Quiero única salida de los sub-lista cuyos elementos son 0 ó 1. La producción de la lista anterior debe ser:
{{1, 0, 0}, {0, 1, 1}, {1}}
puedo obtener la lista que satisfaga mis condiciones con esto:
lst /. x:{(1 | 0) ..} :> x
Pero, ¿cómo puedo obtener el inverso del patrón? de esta manera:
lst /. x:NOT{(1 | 0) ..} :> Sequence[]
Así que yo pueda obtener el resultado de un solo golpe.
Gracias!
Solución
Esta es una aplicación agradable para algunos / todos los registros:
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). *)
Así que primero hacer una función que comprueba una lista secundaria para todos los ceros / los:
chk[lst_] := every[#==0||#==1&, lst]
A continuación, filtrar la lista de listas de listas secundarias que pasan la prueba:
Select[lst, chk]
O, como una sola línea:
Select[lst, every[#==0||#==1&, #]&]
Otros consejos
A partir de:
lst = {{1, 0, 0}, {0, 1, 1}, {2, 0, 1}, {1}, {0, 3}};
Puedes realizar un filtrado con esto:
Cases[lst, {(1 | 0) ..}]
O conseguir el complemento, ya sea con:
Cases[lst, Except @ {(1 | 0) ..} ]
o
DeleteCases[lst, {(1 | 0) ..}]