有没有办法从Mathematica中的列表中删除元素

时间:2013-09-04 08:30:35

标签: wolfram-mathematica

Wolfram Mathematica中是否有从原始列表中删除元素的功能? 例如

a={1,2,3};
DeleteFrom[a,1];
a

a={2,3}

如果没有,任何人都可以举出这种功能的有效变体的例子吗? (我知道有函数Delete()但它会创建新的列表。如果列表很大,那就不好了)

5 个答案:

答案 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网站:

enter image description here

答案 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];代替第二行。