Функции Mathematicas Map и Join используются вместе - PullRequest
0 голосов
/ 24 марта 2012

Я возился с кодом Mathematica для объединения двух списков, но выполнял некоторые операции с одним списком, прежде чем добавить его в другой. Так, например, у меня есть

list={{1, "A"}, {1, "B"}, {1, "C"}, {2, "D"}, {2, "E"}, {2, "F"}};
p = {};
q = {};

ones = Select[list, #[[1]] == 1 &];

p = Join[{#[[2]], "t"}, p] & /@ Reverse[ones];
Table[
  q = Join[{{ones[[m, 2]], "t"}}, q];
  , {m, Length[ones]}];

twos = Select[list, #[[1]] == 2 &];

p = Join[{{#[[2]], "t"}}, p] & /@ Reverse[twos];

Table[
  q = Join[{{twos[[m, 2]], "t"}}, q];
  , {m, Length[twos]}];

Это дает следующие значения p и q соответственно:

p={{{F, t}, {C, t}, {B, t}, {A, t}}, {{E, t}, {C, t}, {B, t}, {A, t}}, {{D, t}, {C, t}, {B, t}, {A, t}}}

и

q={{F, t}, {E, t}, {D, t}, {C, t}, {B, t}, {A, t}}

Из того, что я могу извлечь, второй раз Join используется с функцией /@ или Map, каждый элемент списка в p, который на данный момент равен {{C, t}, {B, t}, {A, t}}, применяется к функции Join и добавлен в список результатов. Есть ли способ использовать Map и вместо этого применять присоединение к новому значению p каждый раз, чтобы получить результат, точно такой же, как значение q, но достигнутый с помощью одной строки кода.

Я попробовал ту же строку кода, используя PrependTo вместо Join, и она работает нормально, я предполагаю, что это потому, что PrependTo обновляет значение p при каждом вызове функции. Например PrependTo[p, {#[[2]], "t"}] & /@ twos;

Причина, по которой я пытался это сделать, заключалась в том, чтобы определить, будет ли эффективнее использовать Join, а не PrependTo. Но столкнулся с этой проблемой, прежде чем я смог получить ответ.

Другая вещь, которую я не совсем понимаю, - это то, почему мне нужно применять Reverse[] к спискам при использовании Map для достижения того же результата, что и при прохождении по списку с использованием цикла. Может ли кто-нибудь объяснить, почему это так ?! Я бы предположил, что Map пробежит список вперед. Но мне кажется, что такое поведение обходит список задом наперед.

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 24 марта 2012

Карта перемещается по списку, как и следовало ожидать, влево-вправо. Я подозреваю, что более поздние элементы вашего кода вводят изменения.

Например:

Sqrt /@ Select[Range@10, OddQ] 

дает {1, Sqrt [3], Sqrt [5], Sqrt [7], 3}

Если вы хотите применить некоторую функцию к функциям из вашего списка, а другую функцию к двум, структура на функциональном языке может выглядеть примерно так:

ans=Join[f1 /@ Select[myList, #[[1]] == 1 &], f2 /@ Select[myList, #[[1]] == 2 &]]

Исходя из ваших разъяснений:

Способ 1 для получения q:

Reverse /@ Reverse@list /. {2 -> "t", 1 -> "t"}

Метод 2:

Reverse@Join[{Last@#, "t"} & /@ Select[list, #[[1]] == 1 &], {Last@#, "t"} & /@ Select[list, First@# == 2 &]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...