2012-03-24 65 views
0

我一直在擺弄一些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將通過一個列表轉發。但是這種行爲在我看來似乎是向後遍歷列表。

在此先感謝您的幫助。

回答

0

按照您的預期,地圖按左右方向遍歷列表。我懷疑後面的代碼元素正在引入反轉。

例如:

Sqrt /@ Select[[email protected], OddQ] 

給{1,的Sqrt [3],的Sqrt [5],的Sqrt [7],3}

如果你想添加一些功能,適用於從那些您的列表和其他功能的三三兩兩的函數式語言的結構可能是這個樣子:

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

另外:

方法1產生問:

Reverse /@ [email protected] /. {2 -> "t", 1 -> "t"} 

方法2:

[email protected][{[email protected]#, "t"} & /@ Select[list, #[[1]] == 1 &], {[email protected]#, "t"} & /@ Select[list, [email protected]# == 2 &]] 
+0

你真的對了想幹什麼輸出中? – 2012-03-24 19:51:49

+0

我希望我的輸出與q相同。所以基本上我想要在Join上使用Map獲得相同的輸出,即時通過使用Join來使用Table。 – Steve 2012-03-24 19:59:13