python - 简单算法题 - 生成矩阵

题目要求

已知两个列表

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视作整体,再次嵌套列表生成式

欢迎交流相互学习。

你可能感兴趣的:(python - 简单算法题 - 生成矩阵)