Wolfram Mathematica 中是否有从原始列表中删除元素的功能?例如
a={1,2,3};
DeleteFrom[a,1];
a
a={2,3}
如果它不存在,任何人都可以举出这种功能的有效变体的例子吗?(我知道有函数 Delete() 但它会创建新列表。如果列表很大,这不好)
Wolfram Mathematica 中是否有从原始列表中删除元素的功能?例如
a={1,2,3};
DeleteFrom[a,1];
a
a={2,3}
如果它不存在,任何人都可以举出这种功能的有效变体的例子吗?(我知道有函数 Delete() 但它会创建新列表。如果列表很大,这不好)
如果要从列表中删除第一个元素,a
则语句
Drop[a,1]
a
返回一个与没有第一个元素的列表相同的列表。请注意,这不会更新a
. 为此,您可以将结果分配给a
,例如
a = Drop[a,1]
请注意,这可能正是Delete
幕后正在做的事情;a
首先制作一个没有第一个元素的副本,然后将名称分配a
给该新列表,然后释放旧列表使用的内存。
比较 Mathematica 中的破坏性更新和非破坏性更新是相当复杂的,可以深入了解系统的内部结构。您会在Stack Exchange Mathematica 网站上找到很多关于该主题的信息。
将元素分配给一个空序列,它将从列表中删除。这适用于任何元素。
In[1] := a = {1,2,3}
Out[1]= {1,2,3}
In[2] := a[[1]] = Sequence[]
Out[2] = Sequence[]
In[3] := a
Out[3] = {2,3}
是的,Mathematica 倾向于非破坏性编程,但 Wolfram 的程序员非常聪明,代码似乎运行得很快。很难相信他们总是会复制整个列表来更改一个元素,即不进行任何优化。
改进user3446498
的答案,您可以执行以下操作:
In[1] := a = {1,2,3};
In[2] := a[[1]] = Nothing;
In[3] := a
Out[3] = {2,3}
In[4] := a == {2,3}
Out[4] = True
此Nothing
符号在第 10 版(2015 年)中引入,请参见此处。
@user3446498 和 @pmsoltani 的两种解决方案实际上都不会删除该元素。测试:
a = {1, 2, 3};
a[[2]] = Sequence[]; (* or Nothing *)
--a[[1]];
++a[[2]];
a
他们都输出{0, 4, 3}
,而{0, 4}
预期。
将第二行替换为a = Delete[a, 2];
可行。