我是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[]
这样我就可以一举得到结果。
谢谢!
答案 0 :(得分: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) ..}]
答案 1 :(得分: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&, #]&]