从嵌套列表中快速提取元素

bar*_*eus 6 wolfram-mathematica

这是Mathematica中列表操作的基本问题.我有一个大型列表,其中每个元素都有以下原理图形式:{List1,List2,Number}.例如,

a = {{{1,2,3},{1,3,2},5},{{1,4,5},{1,0,2},10},{{4,5,3},{8,3,4},15}}}.

我想制作一个新列表,其中只包含每个子列表中的一些部分.例如,从每个子列表中挑出第三个元素,从上面给出{5,10,15}.或者删除第三个元素以返回{{{1,2,3},{1,3,2}},{{1,4,5},{1,0,2}},{{4,5, 3},{8,3,4}}}.

我可以使用table命令构建新列表,例如,

Table[a[[i]][[3]],{i,1,Length[a]}
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有一种必须更快的方法可以在大型列表上工作.

oge*_*ard 7

在Mathematica版本5及更高版本中,您可以使用关键字All以多种方式指定列表遍历.

例如,您可以编写代替您的表

a[[All,3]]
Run Code Online (Sandbox Code Playgroud)

在这里,Mathematica将All转换为第一维的所有可接受的索引,然后获取下一维的第3个.

这样做通常比使用Mathematica编程语言进行循环更有效.对于需要选择或扫描的事物始终存在的同源列表来说,它确实很好.

另一种有效的符号和捷径是;; 句法:

a[[ All, 1 ;; 2]]
Run Code Online (Sandbox Code Playgroud)

将扫描a的第一级并从每个子列表的第1个元素到第2个元素获取所有内容,与第二个案例完全相同.

实际上All和;; 可以组合到任意数量的级别.;; 甚至可以以类似于Mathematica中的任何迭代器的方式使用:

a[[ start;;end;;step ]]
Run Code Online (Sandbox Code Playgroud)

会做同样的事情

Table[ a[[i]], {i,start,end,step}]
Run Code Online (Sandbox Code Playgroud)

你可以省略start,end或step中的一个,它的默认值为1,Length [(隐式列表)]和1.

你可能想在Mathematica的帮助查找的另一件事是ReplacePart,并MapAt允许程序替换结构化表达式的.有效使用它的关键是在ReplacePart中,您可以使用模式来指定要替换的事物的坐标,并且您可以定义要应用于它们的函数.

您的数据示例

ReplacePart[a, {_, 3} -> 0]
Run Code Online (Sandbox Code Playgroud)

将用0替换每个子列表的每个第3部分.

ReplacePart[a, {i : _, 3} :> 2*a[[i, 3]]]
Run Code Online (Sandbox Code Playgroud)

将每个子列表的每个第3部分加倍.