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!

¿Fue útil?

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) ..}]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top