β

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

不懂真人 374 阅读

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

分析:

1.转变过程如下:

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

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

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

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

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

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

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

 In [104]: l
 Out[104]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
 
 In [105]: zip(*l)
 Out[105]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
 
 In [106]: map(list,zip(*l))
 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])的结果才会是一样的,如下:

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

发表评论