Python程式碼閱讀(第41篇):矩陣轉置

Felix發表於2021-11-29
Python 程式碼閱讀合集介紹:為什麼不推薦Python初學者直接看專案原始碼

本篇閱讀的程式碼實現了將一個使用巢狀列表表示的矩陣進行轉置的功能。

本篇閱讀的程式碼片段來自於30-seconds-of-python

transpose

def transpose(lst):
  return list(zip(*lst))

# EXAMPLES
transpose([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]) # [(1, 4, 7, 10), (2, 5, 8, 11), (3, 6, 9, 12)]

transpose函式接收一個列表形式的矩陣,返回該矩陣轉置後的結果。

transpose函式的輸入列表的元素同樣是一個列表,這些子列表的長度一致(每個子列表相當於矩陣的一行),構成一個矩陣。函式使用zip接收這些子列表,然後同時迭代這些子列表(矩陣的行)。每次迭代這些列表的一個元素構成一個元組(相當於迭代出矩陣的一列)。這些元組組成一個新的列表,這個列表的每一元素都是矩陣的一列,此時,原矩陣完成了轉置操作。

zip(*iterables)建立一個聚合了來自每個可迭代物件中的元素的迭代器。它返回一個元組的迭代器,其中的第i個元組包含來自每個引數序列或可迭代物件的第i個元素。 當所輸入可迭代物件中最短的一個被耗盡時,迭代器將停止迭代。 當只有一個可迭代物件引數時,它將返回一個單元組的迭代器。不帶引數時,它將返回一個空迭代器。

程式碼中zip(*lst)的入參形式*lst比較特殊。 *將列表lst解包,使其每個元素分別作為引數同時傳遞給zip函式。

>>> a = [1,2,3]
>>> b = [-1,-2,-3]
>>> temp1 = zip(a,b)
>>> temp2 = zip(*[a,b])
>>> temp3 = zip([a,b])
>>> list(temp1)
[(1, -1), (2, -2), (3, -3)]
>>> list(temp2)
[(1, -1), (2, -2), (3, -3)]
>>> list(temp3)
[([1, 2, 3],), ([-1, -2, -3],)]

相關文章