2010-11-24 71 views
13

我有一个二维列表和一个一维列表。我想将1D列表作为附加列插入到2D列表中。例如:追加到表格的行

array = {{a,1,2},{b,2,3},{c,3,4}}; 
column = {x,y,z}; 

成为

final = {{a,1,2,x},{b,2,3,y},{c,3,4,z}}; 

我已经做了粗暴的:

Table[Insert[array[[i]], column[[i]], 4], {i, Length[array]}]; 

我的问题:什么是数学这样做的正确方法?我不认为它需要我使用的循环。我的解决方案感觉很难看。

回答

14

例如:

[email protected][[email protected], column] 

您也可以是一个函数,像这样:

subListAppend = [email protected][[email protected]#1, #2] &; 
subListAppend[array, column] 

这使得它更容易,如果你经常使用它。当然,如果你想插入除了最后的任何地方,你可以使用Insert[]

subListInsert = [email protected][[email protected]#1, #2, #3] &; 
subListInsert[array, column, 2] 
--> {{a, x, 1, 2}, {b, y, 2, 3}, {c, z, 3, 4}} 

编辑:由于强制性的速度优化的讨论已经开始,这里有一些结果使用this和10000x200阵列:

[email protected]{{array, List /@ column}}:    0.020 s 
[email protected][[email protected], column]:   0.067 s 
MapThread[Append, {array, column}]:     0.083 s 
MapThread[Insert[#1, #2, 4] &, {array, column}]: 0.095 s 
Map[Flatten, Flatten[{array, column}, {2}]]:  0.26 s 
ConstantArray based solution:      0.29 s 
Partition[[email protected][{array, column}], 4]: 0.48 s 

与获奖者是ArrayFlatten

+1

好吧,这并获得成功,谢谢!现在我需要分开来理解*为什么*,但这对我来说是这样做的。 – 2010-11-24 19:48:31

+0

一次只能找一个元素(例如,看看Transpose @ array做什么),然后你就会知道:-)。 – Timo 2010-11-24 19:50:25

+0

是的,这有帮助。这就像折纸。我知道我是在不必要地打击Mathematica。再次感谢。 – 2010-11-24 19:57:40

5

另一种可能性是

result = ConstantArray[0, Dimensions[array] + {0, 1}]; 
result[[All, 1 ;; Last[Dimensions[array]]]] = array; 
result[[All, -1]] = column; 

这似乎是我的电脑对于大数值的矩阵上更快,但它需要额外的变量。如果你正在处理真实价值的条目,你会想要使用

result = ConstantArray[0.0, Dimensions[array] + {0, 1}]; 

保持速度增益。

还有

MapThread[Append, {array, column}] 

这也快(典雅IMO),但将解开结果。 (但如果你有象征性的项目作为例子,这不是一个问题。)

3

这个怎么样?

pos = 4; 
MapThread[Insert[#1, #2, pos] &, {array, column}] 
3

我(有时)喜欢用Flatten进行转置,因为它与“衣衫褴褛”的数组一起工作。

Map[Flatten, Flatten[{array, column}, {2}]] 

给予

{{A,1,2,X},{B,2,3,Y},{C,3,4,Z}}

但是,如果比方说,列只有2个元件

column2 = {x, y}; 
Map[Flatten, Flatten[{array, column2}, {2}]] 

给予

{{A,1,2,X},{b,2,3,Y},{C,3,4}}

(移调不会在这里工作)

5

这是我尝试使用加入

In[11]:= Join[array,List/@column,2] 
Out[11]= {{a,1,2,x},{b,2,3,y},{c,3,4,z}} 

这可能是媲美最快的国家之一前面提到的节目之中。

1

虽然没有像实用或有效的,因为一些现存的方法,这里有两个添加到列表:

ArrayPad[array, {0,{0,1}}, List /@ column] 

PadRight[array, Dimensions[array] + {0, 1}, List /@ column]