寫乙個函式,接收兩個由巢狀列表模擬成的矩陣,返回乙個巢狀列表作為計算結果,要求執行效果如下:
>>> matrix1 = [[1, 1], [-3, 4]]
>>> matrix2 = [[2, -1], [0, -5]]
>>> add(matrix1, matrix2)
[[3, 0], [-3, -1]]
>>> matrix1 = [[1, -2, 3], [-4, 5, 6], [7, -8, 9]]
>>> matrix2 = [[1, 1, 0], [1, -2, 3], [-2, 2, -2]]
>>> add(matrix1, matrix2)
[[2, -1, 3], [-3, 3, 9], [5, -6, 7]]
最初思路是這樣的:巢狀迴圈遍歷矩陣1的資料,通過index方法獲得行索引和列索引(這裡大錯特錯了),利用索引來取得矩陣2的相同位置的資料,再進行加法。
由於忽略了index方法只能找到第乙個值的索引,導致當矩陣中有重複元素時,會一直用重複元素中的第乙個進行計算。
正確的做法:
直接按照索引遍歷,再用多個下標操作符去取得元素的值。
defadd(matrix1, matrix2):
result =
for row in range(len(matrix1)): #
行索引 row_result =
for column in range(len(matrix1[row])): #
列索引行結果
矩陣結果
return result
這樣寫,只能計算兩個矩陣的加法,我們需要進一步擴充套件這個函式的功能,比如,讓它可以計算任意多個矩陣的加法
只需要改成動態引數,每個位置的結果根據矩陣個數進行相應次數的計算。主體思路不變,仍然是以第乙個矩陣的索引為準,取得其他矩陣對應位置的資料相加。
def add(*args):result =
num = len(args) #
獲得矩陣個數,方便後面的計算
for row in
range(len(args[0])):
row_result =
for column in
range(len(args[0][row])):
value_result = args[0][row][column] #
儲存單個資料計算結果
for x in range(num - 1): #
進行(矩陣數-1)次加法
value_result += args[x + 1][row][column]
return result
這時,我們還想再完善一下這個函式,矩陣加法要求矩陣的行列數必須保持一致,我們就讓它能夠檢測傳入的矩陣的一致性,並丟擲異常
valueerror:given matrices are not the same size.
再進行計算之前,先檢測合法性,遍歷檢視後續矩陣的行列數是否和第乙個矩陣相同。
這裡,使用filter以資料長度為條件進行篩選,若有被篩出去的資料,就說明矩陣大小不一致。
def add(*args):result =
num = len(args) #
獲得矩陣個數,方便後面的計算
row_num =len(args[0])
column_num = len(args[0][0]) #
獲得矩陣1的行列數,用於檢測參與計算的矩陣的一致性
try: #
檢測行數是否一致,若有被篩出去的矩陣,說明不一致
if len(list(filter(lambda r: len(r) == row_num, args))) !=num:
raise valueerror('
given matrices are not the same size.')
for x in range(num): #
# 檢測列數是否一致,若有被篩出去的行,說明不一致
if len(list(filter(lambda r: len(r) == column_num, args[x]))) !=row_num:
raise valueerror('
given matrices are not the same size.')
for row in
range(len(args[0])):
row_result =
for column in
range(len(args[0][row])):
value_result = args[0][row][column] #
儲存單個資料計算結果
for x in range(num - 1): #
進行(矩陣數-1)次加法
value_result += args[x + 1][row][column]
return
result
except
valueerror:
raise
python 多維列表(巢狀列表)
python 多維列表 巢狀列表 姓名,年齡,工資 姓名,年齡,工資 姓名,年齡,工資 字串 姓名,年齡,工資 例如 張三,30,2000 str 張三,30,2000 l str.split print l emp list 單個人的資訊 info input 請輸入員工資訊 info list ...
python巢狀列表實現矩陣轉置的理解
code 對矩陣進行轉置 matrix 1,2,3,4 5,6,7,8 9,10,11,12 transposed row i for row in matrix for i in range 4 列表解析先從外層開始,即 for i in range 4 i首先取0,再到內層 row i for ...
Python 巢狀列表展開
問題1 對於列表形如 list 1 1,2 3,4,5 6,7 8 9 轉化成列表 list 2 1,2,3,4,5,6,7,8,9 的問題。python實現 普通方法 list 1 1,2 3,4,5 6,7 8 9 list 2 for in list 1 list 2 print list 2...