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

欢迎交流相互学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1)这本书为什么值得看: Python语言描述,如果学的Python用这本书学数据结构更合适 2016年出版,内容...
    孙怀阔阅读 14,318评论 0 15
  • 仅为个人学习笔记,复习用 一.简单介绍 1. Python适合的领域 web网站和各种网络服务 系统工具和脚本 作...
    皮蛋豆腐酱油阅读 3,068评论 0 0
  • python基础语法总结 参考:Python基础语法总结 参考:1.Python标识符 在 Python 里,标识...
    跟着大佬走阅读 3,382评论 0 0
  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 19,198评论 17 410
  • 渐变的面目拼图要我怎么拼? 我是疲乏了还是投降了? 不是不允许自己坠落, 我没有滴水不进的保护膜。 就是害怕变得面...
    闷热当乘凉阅读 9,765评论 0 13