Osi*_* Xu 10 null wolfram-mathematica
我需要If在Table循环内部使用,例如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)
Run Code Online (Sandbox Code Playgroud)----> {1, 2, 3, 4}
有关更多信息,请参阅SlotSequence.
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)
代替.
最后,如果您需要生成列表而不向其添加被拒绝的元素(以节省内存),我建议使用Reap和Sow:
Reap@Do[If[i < 3, Sow[i]], {i, 5}]
list = %[[2, 1]]
Run Code Online (Sandbox Code Playgroud)
我还没有真正验证过这个内存的使用情况Table,并注意到如果只生成可以存储在打包数组中的数字,那么Table构造可能会更有效.另一方面,如果你生成了大量的通用表达式,其中大部分将被拒绝If,Sow/ Reap可能会更好.
作为替代方案,你可以使用的变化Table,从这个答案,这是专为条件构建表的设计.以下是它的外观:
In[12]:= tableGenAltMD[i,{i,5},#<3&]
Out[12]= {1,2}
Run Code Online (Sandbox Code Playgroud)
最后一个参数是表示条件的函数.实际上也可以使用i直接使用(和/或其他迭代器变量)的语法,并且这样的语法可能不难添加.
前面的anwser中,该部分## &[]可以用内置符号代替Nothing
Table[If[i < 3, i, Nothing], {i, 5}]
Run Code Online (Sandbox Code Playgroud)
给出
{1, 2}
Run Code Online (Sandbox Code Playgroud)