题目要求
已知两个列表
lst_1 = [1, 2, 3, 4]
lst_2 = ['a', 'b', 'c', 'd']
请写算法,将两个列表交叉相乘,生成如下的矩阵
[['1a', '2a', '3a', '4a'],
['1b', '2b', '3b', '4b'],
['1c', '2c', '3c', '4c'],
['1d', '2d', '3d', '4d']]
思路分析
根据观察,矩阵的横列表个数取决于lst_1
,竖列表个数取决于lst_2
,可以先对lst_2进行for 循环处理,再嵌套一层lst_1的for循环遍历添加列表,最终添加的列表进行追加。
示例代码
import pprint
lst_1 = [1, 2, 3, 4]
lst_2 = ['a', 'b', 'c', 'd']
result_lst = []
for i in lst_2:
tmp_lst = []
for j in lst_1:
value = str(j) + i
tmp_lst.append(value)
result_lst.append(tmp_lst)
pprint.pprint(result_lst)
分析时间复杂度
for i in lst_2
遍历n复杂度为4,f(n) = n
for j in lst_1
遍历n复杂度为4,但是嵌套在上个列表中,所以复杂度为f(n) = n^2
该算法复杂度为f(n)= n^2
优化思考
从逻辑上必须每个值需要遍历后进行组合,所以并没有优化复杂度的空间。
但是可以利用列表生成式
简化代码
[[str(j) + i for j in lst_1] for i in lst_2]
[['1a', '2a', '3a', '4a'],
['1b', '2b', '3b', '4b'],
['1c', '2c', '3c', '4c'],
['1d', '2d', '3d', '4d']]
一次性想写出最简代码是不可能的,先写出能实现功能的代码,再一步步推进推导。
我个人的思路过程:
先实现一个列表生成式
for i in lst_2:
tmp_lst = [str(j) + i for j in lst_1]
print(tmp_lst)
==============================================
['1a', '2a', '3a', '4a']
['1b', '2b', '3b', '4b']
['1c', '2c', '3c', '4c']
['1d', '2d', '3d', '4d']
再将tmp_lst
视作整体,再次嵌套列表生成式
欢迎交流相互学习。