过滤掉Mathematica中的子列表

jsc*_*oot 4 wolfram-mathematica rule-engine

我是mathematica的新手用户.这是我的问题:

例如,我有一个嵌套列表:

 lst = {{1, 0, 0}, {0, 1, 1}, {2, 0, 1}, {1}, {0,3}}
Run Code Online (Sandbox Code Playgroud)

我想只输出元素为0或1的子列表.上面列表的输出应该是:

{{1, 0, 0}, {0, 1, 1}, {1}}
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式获得满足我条件的列表:

lst /. x:{(1 | 0) ..} :> x
Run Code Online (Sandbox Code Playgroud)

但是,我怎样才能得到模式的反转?像这样:

 lst /. x:NOT{(1 | 0) ..} :> Sequence[]
Run Code Online (Sandbox Code Playgroud)

这样我就能一举得到结果.

谢谢!

Mr.*_*ard 6

从...开始:

lst = {{1, 0, 0}, {0, 1, 1}, {2, 0, 1}, {1}, {0, 3}};
Run Code Online (Sandbox Code Playgroud)

你可以用这个过滤:

Cases[lst, {(1 | 0) ..}]
Run Code Online (Sandbox Code Playgroud)

或者得到以下两者的补充:

Cases[lst, Except @ {(1 | 0) ..} ]
Run Code Online (Sandbox Code Playgroud)

要么:

DeleteCases[lst, {(1 | 0) ..}]
Run Code Online (Sandbox Code Playgroud)


dre*_*ves 5

对于某些/每个人来说这是一个很好的应用:

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).  *)
Run Code Online (Sandbox Code Playgroud)

所以首先创建一个检查所有零/一个子列表的函数:

chk[lst_] := every[#==0||#==1&, lst]
Run Code Online (Sandbox Code Playgroud)

然后筛选通过测试的子列表的列表列表:

Select[lst, chk]
Run Code Online (Sandbox Code Playgroud)

或者,作为一个单行:

Select[lst, every[#==0||#==1&, #]&]
Run Code Online (Sandbox Code Playgroud)

  • 多谢,伙计!从你的线索,我有另一个解决方案:案例[lst,{(1 | 0)..}] (4认同)