在 Mathematica 中过滤掉子列表

发布于 2024-08-03 06:57:17 字数 443 浏览 5 评论 0原文

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

这样我就可以一笔画出结果。

谢谢!

I am a newbie user in mathematica. Here is my problem:

For example, I have a nested list:

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

I want to only output those sublist whose elements are 0 or 1. The above list's output should be:

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

I can get the list that satisfies my conditions with this:

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

But how can I get the converse of the pattern? like this:

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

So that i can get the result in one stroke.

thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

别在捏我脸啦 2024-08-10 06:57:17

开头为:

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

Starting with:

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

You can filter with this:

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

Or get the complement with either:

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

or:

DeleteCases[lst, {(1 | 0) ..}]
送舟行 2024-08-10 06:57:17

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

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&, #]&]

This is a nice application for some/every:

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).  *)

So first make a function that checks a sublist for all zeroes/ones:

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

Then filter your list-of-lists for sublists that pass the test:

Select[lst, chk]

Or, as a one-liner:

Select[lst, every[#==0||#==1&, #]&]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文