数学地图和连接功能一起使用

时间:2012-03-24 16:11:46

标签: wolfram-mathematica

我一直在摆弄一些Mathematica代码来加入2个列表,但是在将它添加到另一个列表之前对一个列表进行一些操作。所以例如我有

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 :(得分:0)

地图会按照您的预期在左右方向上遍历列表。我怀疑你的代码后来的元素会引入逆转。

例如:

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 &]]