如何将列表{element,...}转换为元组列表{{i,element},...}?

nix*_*gle 7 wolfram-mathematica

给出一些清单

numbers = {2,3,5,7,11,13};
Run Code Online (Sandbox Code Playgroud)

我该如何翻译

translatedNumbers = {{1,2},{2,3},{3,5},{4,7},{5,11},{6,13}}
Run Code Online (Sandbox Code Playgroud)

简洁?

我知道如何使用程序化的编程风格如下:

Module[{lst = {}, numbers = {2, 3, 5, 7, 11, 13}},
  Do[AppendTo[lst, {i, numbers[[i]]}], {i, 1, Length@numbers}]; lst]
Run Code Online (Sandbox Code Playgroud)

但对于我来说这是一个简单的操作,这种情况相当冗长.例如,相当于haskell的是

numbers = zip [1..] [2,3,5,7,11,13]
Run Code Online (Sandbox Code Playgroud)

我不禁想到在Mathematica中有一个更简洁的方法来"索引"一个数字列表.

可能的答案

显然我不允许在灯泡熄灭后回答我自己的问题,除非我有100个"代表".所以我只想把答案放在这里.让我知道我是否应该以不同的方式做任何事情.

在问过这个之后我现在感觉有点傻了.因为如果我将mathematica列表视为矩阵,我可以转置它们.因此,我的问题的答案(也许不是最好的)如下:

Transpose[{Range@6, {2, 3, 5, 7, 11, 13}}]
Run Code Online (Sandbox Code Playgroud)

编辑为任意输入列表工作,我认为如下:

With[{lst={2, 3, 5, 7, 11, 13}},Transpose[{Range@Length@lst,lst}]]
Run Code Online (Sandbox Code Playgroud)

将工作.我可以做得更好吗?

小智 7

需要考虑的一件事是,转换是否会解压缩数据.这对于大型数据集很重要.

On["Packing"]

numbers = Developer`ToPackedArray@{2, 3, 5, 7, 11, 13};
Run Code Online (Sandbox Code Playgroud)

这将打开包装

MapIndexed[{First[#2], #1} &, numbers]
Run Code Online (Sandbox Code Playgroud)

这不会

Transpose[{Range[Length[#]], #}] &[numbers]

Off["Packing"]
Run Code Online (Sandbox Code Playgroud)


cob*_*bal 6

我会改用MapIndexed

MapIndexed[{First[#2], #1} &, numbers]
Run Code Online (Sandbox Code Playgroud)

  • Transpose方法的速度要快几个数量级. (4认同)