我一直在擺弄一些Mathematica代碼來加入2個列表,但在將其添加到另一個列表之前做一些操作。所以,比如我有Mathematicas Map and Join功能一起使用
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
將通過一個列表轉發。但是這種行爲在我看來似乎是向後遍歷列表。
在此先感謝您的幫助。
你真的對了想幹什麼輸出中? – 2012-03-24 19:51:49
我希望我的輸出與q相同。所以基本上我想要在Join上使用Map獲得相同的輸出,即時通過使用Join來使用Table。 – Steve 2012-03-24 19:59:13