我一直在摆弄一些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
将通过列表转发。但是这种行为在我看来好像正在向后遍历这个行列。
提前感谢您的帮助。
答案 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 &]]