Wolfram Mathematica中是否有从原始列表中删除元素的功能? 例如
a={1,2,3};
DeleteFrom[a,1];
a
a={2,3}
如果没有,任何人都可以举出这种功能的有效变体的例子吗? (我知道有函数Delete()但它会创建新的列表。如果列表很大,那就不好了)
答案 0 :(得分:3)
如果要从列表a
中删除第一个元素
Drop[a,1]
返回与a
相同的列表而没有第一个元素。请注意,这不会更新a
。为此,您可以将结果分配给a
,例如
a = Drop[a,1]
请注意,这可能正是Delete
在幕后所做的事情;首先制作a
没有第一个元素的副本,然后将名称a
分配给该新列表,然后释放旧列表使用的内存。
比较Mathematica中的破坏性更新和非破坏性更新非常复杂,可以深入了解系统的内部结构。你会在Stack Exchange Mathematica site.
上找到很多关于这个主题的内容答案 1 :(得分:1)
每次更改 Mathematica 中列表的长度时,都会导致重新分配列表,这需要O(n)而不是O(1)时间。虽然不存在“DeleteFrom”函数,但如果它存在,则不会比a = Delete[a, x]
快。
如果您可以提前创建要删除的所有元素的列表并立即删除它们,您将获得更好的性能。如果你不能,你将不得不找到另一种方法来制定你的问题。如果您还有其他问题,我建议您加入我们正确的Stack Exchange网站:
答案 2 :(得分:1)
将元素分配给空序列,它将从列表中删除。这适用于任何元素。
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的程序员非常聪明,代码似乎运行得非常快。很难相信他们总会复制整个列表来改变一个元素,即不进行任何优化。
答案 3 :(得分:0)
改善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
在第10版(2015年)中引入了此Nothing
符号,请参阅here。
答案 4 :(得分:0)
@ 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];
代替第二行。