如何删除Mathematica中表中的Null符号?

Osi*_* Xu 10 null wolfram-mathematica

我需要IfTable循环内部使用,例如Table[If[i< 3, i], {i, 5}]将给出{1, 2, Null, Null, Null}

但我希望结果如此{1,2}.

对此有任何修复?

编辑:
如果我们考虑Table[If[i< 3, f[i]], {i, 5}]哪个给出了什么{f[1], f[2], Null, Null, Null}

Mr.*_*ard 29

简明:

Table[If[i < 3, i, ## &[]], {i, 5}]
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为该功能## &不会立即评估.

## & 是一种"消失"的功能.

{1, 2, ## &[], 3, 4}
Run Code Online (Sandbox Code Playgroud)
----> {1, 2, 3, 4}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅SlotSequence.

  • +1提醒所有人关于`##&[]`. (5认同)
  • 我认为这是你的发明.我通常使用`Sequence @@ {}`,这不是那么优雅(也可能会慢一点). (3认同)

Sza*_*lcs 14

如果您需要将其从现有列表中删除,则可以使用

DeleteCases[list, Null]
Run Code Online (Sandbox Code Playgroud)

要么

list /. Null -> Sequence[]
Run Code Online (Sandbox Code Playgroud)

(更先进一点).


关于Table上面的示例,请注意第二个逗号If是不必要的(甚至以粉红色突出显示):

list = Table[If[i < 3, i], {i, 5}]
Run Code Online (Sandbox Code Playgroud)

要按条件过滤表格元素,您可能希望使用类似的内容

list = Select[Table[i, {i, 5}], # < 3 &]
Run Code Online (Sandbox Code Playgroud)

代替.


最后,如果您需要生成列表而不向其添加被拒绝的元素(以节省内存),我建议使用ReapSow:

Reap@Do[If[i < 3, Sow[i]], {i, 5}]
list = %[[2, 1]]
Run Code Online (Sandbox Code Playgroud)

我还没有真正验证过这个内存的使用情况Table,并注意到如果只生成可以存储在打包数组中的数字,那么Table构造可能会更有效.另一方面,如果你生成了大量的通用表达式,其中大部分将被拒绝If,Sow/ Reap可能会更好.


Leo*_*rin 6

作为替代方案,你可以使用的变化Table,从这个答案,这是专为条件构建表的设计.以下是它的外观:

In[12]:= tableGenAltMD[i,{i,5},#<3&]
Out[12]= {1,2}
Run Code Online (Sandbox Code Playgroud)

最后一个参数是表示条件的函数.实际上也可以使用i直接使用(和/或其他迭代器变量)的语法,并且这样的语法可能不难添加.


dat*_*aki 5

前面的anwser中,该部分## &[]可以用内置符号代替Nothing

Table[If[i < 3, i, Nothing], {i, 5}]
Run Code Online (Sandbox Code Playgroud)

给出

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