4

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

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

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

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

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

我可以得到满足我条件的列表:

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

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

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

这样我就可以一口气得到结果。

谢谢!

4

2 回答 2

6

从...开始:

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

你可以用这个过滤:

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

或通过以下任一方式获得补码:

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

或者:

DeleteCases[lst, {(1 | 0) ..}]
于 2011-03-29T20:03:07.540 回答
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).  *)

因此,首先创建一个函数来检查所有零/一的子列表:

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

然后过滤您的列表列表以获取通过测试的子列表:

Select[lst, chk]

或者,作为单行:

Select[lst, every[#==0||#==1&, #]&]
于 2009-09-03T13:02:34.790 回答