2

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

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

a={2,3}

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

4

5 回答 5

4

如果要从列表中删除第一个元素,a则语句

Drop[a,1]

a返回一个与没有第一个元素的列表相同的列表。请注意,这不会更新a. 为此,您可以将结果分配给a,例如

a = Drop[a,1]

请注意,这可能正是Delete幕后正在做的事情;a首先制作一个没有第一个元素的副本,然后将名称分配a给该新列表,然后释放旧列表使用的内存。

比较 Mathematica 中的破坏性更新和非破坏性更新是相当复杂的,可以深入了解系统的内部结构。您会在Stack Exchange Mathematica 网站上找到很多关于该主题的信息。

于 2013-09-04T09:08:28.920 回答
2

每次在Mathematica中更改列表的长度时,都会导致列表重新分配,这需要 O(n) 而不是 O(1) 时间。虽然不存在“DeleteFrom”功能,但如果有,它不会比a = Delete[a, x].

如果您可以提前创建一个包含所有要删除的元素的列表,然后一次将它们全部删除,您将获得更好的性能。如果你不能,你将不得不找到另一种方法来表达你的问题。如果您还有其他问题,我建议您在适当的 Stack Exchange 网站上加入我们:

在此处输入图像描述

于 2013-09-04T15:42:23.457 回答
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 的程序员非常聪明,代码似乎运行得很快。很难相信他们总是会复制整个列表来更改一个元素,即不进行任何优化。

于 2014-08-17T06:57:55.677 回答
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

Nothing符号在第 10 版(2015 年)中引入,请参见此处

于 2017-04-06T23:08:17.510 回答
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];可行。

于 2020-06-20T06:32:27.670 回答