从本实例学到什么
- 输入整数矩阵的做法。
- 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(序列)。作用是,为元素附加序号。