從本實例學到什麼
- 輸入整數矩陣的做法。
- enumerate函數的用法。這是本文重點。
實例程序
題目描述
二維數組求左下三角元素之和
求一個n*n(n<10)數組左下三角(包括主對角線)元素的和。
輸入格式:
先輸入n(n<10)值,然後再輸入各個數組元素值。
輸入樣例:
2
1 2
3 4
輸出格式:
輸出左下三角(包括主對角線)全部元素的和。
輸出樣例:
8
輸入樣例2:
3
1 2 7
3 4 10
4 9 20
輸出樣例2
41
上述題目的參考答案
n = int(input())
#讀入整數矩陣
nmtx = []
for i in range(n):
row = [int(s) for s in input().split()] #讀入一行,把空格分隔的各個數字串轉換爲整數,構成一行
nmtx.append(row) #nmtx矩陣增加一行整數
#累加左下三角的元素
total = 0
for index, row in enumerate(nmtx):
total += sum(row[:index+1])
print(total)
知識點講解
-
上一節給出的代碼中,第3-6行的功能是讀入整數矩陣。扼要解釋如下:
(1-1)nmtx用來存儲整數矩陣。初值爲空列表(矩陣是列表爲元素的列表)。見第3行代碼。
(1-2)第4行代碼表明,循環將執行n次。每一次循環,nmtx將增加一行整數。
(1-3)第5行代碼的執行過程是:先執行input()讀入一行字符串,接着執行split()把字符串內的數字按空格分割成多個數字串,然後對每一個數字串s,執行int(s)轉換爲整數。該整數才成爲列表row的一個元素。
(1-4)第6行是把一行整數追加到矩陣nmtx中。 -
第9行中,調用enumerate函數。調用enumerate函數的寫法是:enumerate(序列)。作用是爲序列中的元素加上序號。生成的結果也是一個序列。
-
舉一個例子說明enumerate函數的用法。
enumerate(['a', 'b', 'c'])
的值是:[(0, 'a'), '(1, 'b'), (2, 'c')]
。(0, 'a')
有兩項,第一項是序號,第二項是原列表的元素。 -
再舉一個例子說明enumerate函數的用法。
enumerate([1.5, 2.8, 3.14, 5.6])
的值是:[(0, 1.5), (1, 2.8), (3, 3.14), (4, 5.6)]
。(0, 1.5)
有兩項,第一項是序號,第二項是原列表的元素。(4, 5.6)
也一樣,第一項是序號,第二項是原列表的元素。 -
以上一節的題目描述中給出的輸入樣例2爲例,我們來看看上一節給出的代碼中第9,10行代碼的執行過程。
(1)前提是,nmtx的值是:
[ [1, 2 ,7],
[3, 4, 10],
[4, 9, 20] ]
(2)enumerate(nmtx)的值是:
[ (0, [1, 2 ,7]),
(1, [3, 4, 10]),
(2, [4, 9, 20]) ]
(3)第9行代碼爲for index, row in enumerate(nmtx)
。第一輪執行時,index取值爲0,row取值爲[1, 2, 7]。
(4)第二輪執行時,index取值爲1,row取值爲[3, 4, 10]。
(5)第三輪執行時,index取值爲2,row取值爲[4, 9, 20]。
(6)對於nmtx中的第index行(index=0, 1, 2),該行中列號爲0, 1, …, index的元素都是左下三角的元素,這些正是第10行代碼中切片row[ :index+1]
取到的元素。sum(row[:index+1])
計算這一行中位於左下三角的元素之和。
- enumerate函數的參數不限於列表,也可以是元組,集合(set),乃至字典,統稱爲序列。
小結
- 本文示範了讀入整數矩陣的做法。這一做法使用了列表推導式。
- 本文重點講解了enumerate函數的用法。寫法是: enumerate(序列)。作用是,爲元素附加序號。