Как преобразовать список {element, ...} в список кортежей {{i, element}, ...}? - PullRequest
7 голосов
/ 09 декабря 2011

Учитывая некоторый список

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]

Но это довольно многословно для того, что мне кажется простой операцией. Например, эквивалент Хаскелла это

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 ]

7 голосов
/ 10 декабря 2011

Следует учитывать, что преобразование не будет распаковывать данные. Это важно для больших наборов данных.

On["Packing"]

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

Это распакует

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

это не будет

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

Off["Packing"]
6 голосов
/ 09 декабря 2011

Я бы использовал MapIndexed вместо

MapIndexed[{First[#2], #1} &, numbers]
1 голос
/ 10 декабря 2011

Ну, моё «решение», возможно, не такое умное, как решение от cobbal, но когда я тестирую его с длинными массивами, оно быстрее (в 5 раз!). Я просто использую:

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

AHH! ruebenko опубликовал аналогичный ответ, когда я написал свой пост. Извините за этот почти лишний пост. Ну, возможно, это не так уж и лишнее. Я проверил свое решение с и без упаковки, и оно работает быстрее всего без упаковки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...