有個朋友提出了一個問題:手頭上現在有一個二維列表,比如[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]],現在要把該二維列表變成為[[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]。
其實不動腦筋的話,用二重循環很容易寫出來:
#! /usr/bin/env python3 # -*- coding:utf-8 -*- # Author : mayi # Blog : http://www.cnblogs.com/mayi0312/ # Date : 2019/4/26 # Name : test01 # Software : PyCharm # Note : 用於實現實現矩陣(二重列表)轉置 def trans(l): a = [[] for i in l[0]] for i in l: for j in range(len(i)): a[j].append(i[j]) return a # 主函數 def main(): l1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] l2 = trans(l1) print(l1) # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] print(l2) # [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]] # 入口函數 if __name__ == '__main__': main()
然而不管怎么看這種代碼都很丑。
如上圖:這種轉置矩陣的即時感是怎么回事?
沒錯,這個問題的本質就是求解轉置矩陣。於是就簡單了,還是用個不動腦筋的辦法:
#! /usr/bin/env python3 # -*- coding:utf-8 -*- # Author : mayi # Blog : http://www.cnblogs.com/mayi0312/ # Date : 2019/4/26 # Name : test01 # Software : PyCharm # Note : 用於實現實現矩陣(二重列表)轉置 def trans(l): for i in range(len(l)): for j in range(i): l[i][j], l[j][i] = l[j][i], l[i][j] return l # 主函數 def main(): l1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] l2 = trans(l1) print(l1) # [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(l2) # [[1, 4, 7], [2, 5, 8], [3, 6, 9]] # 入口函數 if __name__ == '__main__': main()
其實上面代碼還是有點bug,看起來是好用的,然而用這種方法矩陣要求行列長度相同才行。
最后,我們想起了zip。zip的本質就是這樣的,取出列表中的對應位置的元素,組成新列表,正是這個題目要做的。
所以最終,這個題目(轉置矩陣)的Python解法就相當奇妙了:
#! /usr/bin/env python3 # -*- coding:utf-8 -*- # Author : mayi # Blog : http://www.cnblogs.com/mayi0312/ # Date : 2019/4/26 # Name : test01 # Software : PyCharm # Note : 用於實現實現矩陣(二重列表)轉置 def trans(l): l = zip(*l) l = [list(i) for i in l] return l # 主函數 def main(): l1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] l2 = trans(l1) print(l1) # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] print(list(l2)) # [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]] # 入口函數 if __name__ == '__main__': main()