Wolfram mathematica 在Mathematica中有没有从列表中删除元素的方法

Wolfram mathematica 在Mathematica中有没有从列表中删除元素的方法,wolfram-mathematica,Wolfram Mathematica,Wolfram Mathematica中是否有从原始列表中删除元素的功能? 比如说 a={1,2,3}; DeleteFrom[a,1]; a a={2,3} 如果没有,谁能举例说明这种功能的有效变体? 我知道有函数Delete,但它会创建新列表。如果要从语句的列表中删除第一个元素,那么如果列表很大,则这是不好的 Drop[a,1] 返回一个与没有第一个元素的列表相同的列表。请注意,这不会更新a。要做到这一点,你可以把结果分配给a,例如 请注意,这可能正是Delete在幕后所做的事情;首先

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

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

a={2,3}
如果没有,谁能举例说明这种功能的有效变体?
我知道有函数Delete,但它会创建新列表。如果要从语句的列表中删除第一个元素,那么如果列表很大,则这是不好的

Drop[a,1]
返回一个与没有第一个元素的列表相同的列表。请注意,这不会更新a。要做到这一点,你可以把结果分配给a,例如

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


在Mathematica中比较破坏性更新和非破坏性更新是相当复杂的,可以深入系统内部。如果要从语句的列表中删除第一个元素,您将在

上找到许多关于主题的信息

Drop[a,1]
返回一个与没有第一个元素的列表相同的列表。请注意,这不会更新a。要做到这一点,你可以把结果分配给a,例如

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


在Mathematica中比较破坏性更新和非破坏性更新是相当复杂的,可以深入系统内部。每当你在Mathematica中更改列表的长度时,你会在

上找到很多关于这个主题的信息,这会导致列表的重新分配,而不是1次。虽然不存在DeleteFrom函数,但如果存在,则不会比a=Delete[a,x]快

如果您可以预先创建一个包含所有要删除的元素的列表,并一次将它们全部删除,您将获得更好的性能。如果你做不到,你将不得不找到另一种方法来解决你的问题。如果您有其他问题,我建议您在适当的Stack Exchange站点加入我们:


每次在Mathematica中更改列表的长度时,都会导致列表的重新分配,这将持续而不是1次。虽然不存在DeleteFrom函数,但如果存在,则不会比a=Delete[a,x]快

如果您可以预先创建一个包含所有要删除的元素的列表,并一次将它们全部删除,您将获得更好的性能。如果你做不到,你将不得不找到另一种方法来解决你的问题。如果您有其他问题,我建议您在适当的Stack Exchange站点加入我们:


将元素分配给空序列,它将从列表中删除。这适用于任何元素

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的程序员非常聪明,代码运行速度似乎也很快。很难相信他们总是复制整个列表来更改一个元素,即不进行任何优化。

将该元素分配到一个空序列,它将从列表中删除。这适用于任何元素

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的程序员非常聪明,代码运行速度似乎也很快。很难相信他们总是复制整个列表来更改一个元素,即不进行任何优化。

改进用户3446498的答案,您可以执行以下操作:

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
此无符号在2015年第10版中引入,请参见。

改进用户3446498的答案,您可以执行以下操作:

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符号在2015年第10版中引入,请参见。

来自@user3446498和@pmsoltani的两种解决方案实际上都不会删除该元素。测试:

a={1,2,3}; a[[2]]=序列[];*或者什么都没有* -a[[1]]; ++a[[2]]; A. 它们都输出{0,4,3},而{0,4}是预期的


将第二行替换为a=删除[a,2];将起作用。

来自@user3446498和@pmsoltani的两种解决方案实际上都不会删除元素。测试:

a={1,2,3}; a[[2]]=序列[];*或者什么都没有* -a[[1]]; ++a[[2]]; A. 它们都输出{0,4,3},而{0,4}是预期的


将第二行替换为a=删除[a,2];会有用。

真正的任务更复杂。有10000000个数据元素的大列表。某些createria需要从列表中删除一些元素。通常需要去除30-40%的元素。无论如何,谢谢你的链接。你指出了SO及其同类的一个严重问题。你只能回答你提出的问题,而不能回答你想回答的问题。真正的任务更复杂。有10000000个数据元素的大列表。某些createria需要从列表中删除一些元素。通常需要去除30-40%的元素。无论如何,谢谢你的链接。你指出了一个如此严重的问题
我喜欢它。您只能得到您所问问题的答案,而不能得到您想要回答的问题的答案。请注意,定义[a]仍然返回a={Sequence[],2,3}。因此,元素不会被删除,而是被序列[]替换。空序列会随着列表的使用而消失。注b=1*a;定义[b]返回b={2,3}。请注意,定义[a]仍然返回a={Sequence[],2,3}。因此,元素不会被删除,而是被序列[]替换。空序列会随着列表的使用而消失。注b=1*a;定义[b]返回b={2,3}。如果您有一个好的标准,告诉您何时必须删除某个项目,您可以使用选择函数,选择不删除的项目。如果您有一个好的标准,告诉您何时必须删除某个项目,您可以使用选择函数,选择不删除的项目。