这是设计问题,而不是现有功能。
我想用:
{1, 2, 3, 4, 5}[[{1 ;; 3, 2 ;; 5}]]
我期待:
{{1, 2, 3}, {2, 3, 4, 5}}
但它无效:
During evaluation of In[1]:= Part::pspec: Part specification {1;;3,2;;5} is neither an integer nor a list of integers. >>
我不是在问为什么这不起作用(简单:它不受支持)。
相反,不应该工作的原因是什么?也就是说,是否存在不支持此逻辑的原因?
顺便说一句,我特别没有询问嵌套列表语法,如:
{1, 2, 3, 4, 5}[[{{1, 2, 3}, {2, 3, 4, 5}}]]
因为我认为这种情况不那么“规律”且更不稳定,而Span
则更加明确和受控制。
答案 0 :(得分:7)
我认为你问的真正问题是为什么这不起作用:
In[15]:= {1,2,3,4,5}[[{{1,2,3},{2,3,4,5}}]]
During evaluation of In[15]:= Part::pspec: Part specification
{{1,2,3},{2,3,4,5}} is neither an integer nor a list of integers. >>
Out[15]= {1,2,3,4,5}[[{{1,2,3},{2,3,4,5}}]]
因为Span
似乎是在Part
之上实现的更高级别的包装器(这是猜测)。最近关于MathGroup的同样问题has been asked。没有一个令人满意的答案,我的感觉是,从用户的角度来看,这只是一个遗漏 - 我没有看到为什么这不起作用的根本原因。此外,这个功能在某些情况下会让生活变得更轻松。
从技术/实施的角度来看,我可以推测这与扩展的Part
分配功能不一致。具体来说,我们知道Part
不仅可以用于元素提取,还可以用于有效的元素分配,其中可以同时分配整个常规结构(矩形子矩阵),例如
In[18]:=
a = Table[i+j,{i,2},{j,4}]
Out[18]= {{2,3,4,5},{3,4,5,6}}
In[21]:=
a[[All,{2,3}]] = {{7,8},{9,10}};
a
Out[22]= {{2,7,8,5},{3,9,10,6}}
Part
是否允许嵌套列表规范位置,它应该立即为非矩形子结构提供赋值功能,否则它将变得不那么直观(因为会出现角落情况等) 。我怀疑后者不容易实现,因为扩展Part
赋值功能可能直接基于数组内存布局。这也会产生打包数组的问题(出于同样的原因 - 它们不能是粗糙的,必须是矩形的)。也许,如果Mathematica内置了非常有效的粗糙数组结构(如链表),这可以解决。
因此,总结一下:看起来,从实现的角度来看,这样的新功能会引入一些棘手的问题,这可以解释为什么还没有这样做(再次,这是猜测)。另请注意,对于元素提取,可以使用Extract
和已准备好的位置列表来提取任意子结构,这几乎与使用Part
一样有效。