Я возился с кодом 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
пробежит список вперед. Но мне кажется, что такое поведение обходит список задом наперед.
Заранее спасибо за помощь.