给出一些清单
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}]]
会奏效。我可以做得更好吗?
答案 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发布了类似的答案。对不起这个几乎多余的帖子。好吧,也许它不是那么多余。我已经测试了我的解决方案,包括和不包装,它没有包装,工作速度最快。