代码之家  ›  专栏  ›  技术社区  ›  jscoot

过滤掉Mathematica中的子列表

  •  4
  • jscoot  · 技术社区  · 15 年前

    我是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[]
    

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

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  5
  •   dreeves    15 年前

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

    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&, #]&]
    
        2
  •  6
  •   Mr.Wizard naktepe    14 年前

    从:

    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) ..}]