python二维数组[[1, 2, 3], [4, 5, 6], [7, 8, 9]]变为[[1, 4, 7], [2, 5, 8], [3, 6, 9]]的方法

问题: 要求二维数组 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]变为[[1, 4, 7], [2, 5, 8], [3, 6, 9]]形式,过程?

分析:

1.转变过程如下:

1 2 3      1 4 7
4 5 6   —> 2 5 8 
7 8 9      3 6 9

可以将变换过程看成是原二维数组行(row)变成新数组的列(column),即抽出原数组第一行(row)作为第一列(column),第二行(row)作为第二列(column)…当然也可以将变换过程看成是原数组的列变为新数组的行,限于时间,就暂不考虑这种实现方式。

2.最原始的做法,写两个for循环,外层循环依次迭代数组的行(row),内层循环迭代数组的列(column),来实现这个反转过程,将原数组第一行(row)作为第一列(column),第二行(row)作为第二列(column),过程如下:

 1 In [7]:  l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
 2 
 3 In [8]: len_row = 3
 4 
 5 In [9]: len_col = 3
 6 
 7 In [10]: temp = [[],[],[]]
 8 
 9 In [11]: for row in l:
10    ....:     for i in range(len_col):
11    ....:          temp[i].append(row[i])
12    ....:     print temp
13    ....:
14 [[1], [2], [3]]
15 [[1, 4], [2, 5], [3, 6]]
16 [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
17 
18 In [12]:

当然,还可以使用列表推导来做,原理和上面一样,外层迭代row,内层迭代col,生成新的列表:

1 In [100]: l
2 Out[100]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
3 
4 In [101]: [[row[col] for row in l] for col in range(len(l[0])) ]
5 Out[101]: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

最后,对这个题目,用zip也可以达到同样的目的:

1 In [104]: l
2 Out[104]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
3 
4 In [105]: zip(*l)
5 Out[105]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
6 
7 In [106]: map(list,zip(*l))
8 Out[106]: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

*这个符号和列表配合有解压的意思,如l=[[1, 2, 3], [4, 5, 6], [7, 8, 9]],则我理解*l就变成了[1, 2, 3], [4, 5, 6], [7, 8, 9]这样三个值,所以zip(*l)和zip([1, 2, 3], [4, 5, 6], [7, 8, 9])的结果才会是一样的,如下:

1 In [17]: l=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
2 
3 In [18]: zip([1, 2, 3], [4, 5, 6], [7, 8, 9])
4 Out[18]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
5 
6 In [19]: zip(*l)
7 Out[19]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
8 
9 In [20]: