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

时间:2011-12-09 18:45:02

标签: wolfram-mathematica

给出一些清单

numbers = {2,3,5,7,11,13};

如何将其翻译为

translatedNumbers = {{1,2},{2,3},{3,5},{4,7},{5,11},{6,13}}

简明?

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

Module[{lst = {}, numbers = {2, 3, 5, 7, 11, 13}},
  Do[AppendTo[lst, {i, numbers[[i]]}], {i, 1, Length@numbers}]; lst]

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

numbers = zip [1..] [2,3,5,7,11,13]

我不禁认为在 Mathematica 中有一个更简洁的方法来“索引”一个数字列表。

潜在答案

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

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

Transpose[{Range@6, {2, 3, 5, 7, 11, 13}}]

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

With[{lst={2, 3, 5, 7, 11, 13}},Transpose[{Range@Length@lst,lst}]]

会奏效。我可以做得更好吗?

3 个答案:

答案 0 :(得分:7)

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

On["Packing"]

numbers = Developer`ToPackedArray@{2, 3, 5, 7, 11, 13};

这将解压缩

MapIndexed[{First[#2], #1} &, numbers]

这不会

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

Off["Packing"]

答案 1 :(得分:6)

我会改用MapIndexed

MapIndexed[{First[#2], #1} &, numbers]

答案 2 :(得分:1)

嗯,我的“解决方案”可能不如cobbal的解决方案那么聪明,但是当我用长阵列测试时,它更快(因子为5!)。 我只是在使用:

newList = Transpose[{Range[Length[numbers]], numbers}]

AHH!在我写完帖子的过程中,ruebenko发布了类似的答案。对不起这个几乎多余的帖子。好吧,也许它不是那么多余。我已经测试了我的解决方案,包括和不包装,它没有包装,工作速度最快。