一、题目要求
参考编程模板计算两个列表 ls
和 lt
对应元素乘积的和(即向量积),完善程序。
ls = [111, 222, 333, 444, 555, 666, 777, 888, 999]
lt = [999, 777, 555, 333, 111, 888, 666, 444, 222]
示例1:
输入:无
输出:"99999"
修改原题
ls = [111, 222, 333, 444, 555, 666, 777, 888, 999]
lt = [999, 777, 555, 333, 111, 888, 666, 444, 222]
s = 0
......
print(s)
二、多种解法
1. 官方解法
主要采用的是切表切片的方法,分别从两个列表中取值后相乘,再用for循环相加。
ls = [111, 222, 333, 444, 555, 666, 777, 888, 999]
lt = [999, 777, 555, 333, 111, 888, 666, 444, 222]
s = 0
for i in range(len(ls)):
s += ls[i]*lt[i] #对应i位置的元素相乘后累加
print(s)
2. 利用列表推导式
可以采用zip()把两个列表组后和用列表推导式来生成新的列表,最后用sum来求和
ls = [111, 222, 333, 444, 555, 666, 777, 888, 999]
lt = [999, 777, 555, 333, 111, 888, 666, 444, 222]
print(sum(s*t for s,t in zip(ls,lt)))
也可以把官方的代码修改一下,借助列表推导式解决
print(sum([ls[i]*lt[i] for i in range(len(ls))]))
3. 用enumerate和循环的方法
用enumerate来生成列表的索引号,然后用for循环来求和
ls = [111, 222, 333, 444, 555, 666, 777, 888, 999]
lt = [999, 777, 555, 333, 111, 888, 666, 444, 222]
sum = 0
for index, s in enumerate(ls):
sum + = lt[index]
print(sum)
4. 采用pd.Series解决
利和pandas中的Series可以相乘的原理来解决。但是这种方法的前提是已经安装了pandas,否则就会失效。
import pandas as pd
ls = [111, 222, 333, 444, 555, 666, 777, 888, 999]
lt = [999, 777, 555, 333, 111, 888, 666, 444, 222]
print(sum(pd.Series(ls)*pd.Series(lt)))
5. 利用np.array来解决
利用numpy生成一系列的数组,然后两数组相乘就可以科到一个新的列表,直接用sum求和即可。代码如下:
import numpy as np
ls = np.array([111, 222, 333, 444, 555, 666, 777, 888, 999])
lt = np.array([999, 777, 555, 333, 111, 888, 666, 444, 222])
print(sum(ls*lt))
但是,此方法的前提是电脑中要安装numpy包。可以通过pip install numpy来安装。
三、学后反思
- 一题多解,殊途同归。尝试多种方法解决同一问题,可以举一反三,增加Python编程的灵活性。
- 用列表推导式可以最大限度地减化步骤。