文末有福利领取哦~
👉一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉二、Python必备开发工具
👉三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉 四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
👉五、Python练习题
检查学习结果。
👉六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
import itertools
itertools模块返回大多都是可迭代序列,如果直接输出的话…
print(itertools.permutations([1, 2, 3]))
会返回它所在地址
<itertools.permutations object at 0x000001BFAB6B2E00>
因此可遍历返回的迭代对象
for i in itertools.permutations([1, 2, 3]):
print(i, end=" ")
结果:
(1, 2, 3) (1, 3, 2) (2, 1, 3) (2, 3, 1) (3, 1, 2) (3, 2, 1)
另外还能加个参数,表示返回元素的长度
for i in itertools.permutations([1, 2, 3], 2):
print(i, end=" ")
结果:
(1, 2) (1, 3) (2, 1) (2, 3) (3, 1) (3, 2)
通过输出它的类型发现
for i in itertools.permutations([1, 2, 3], 2):
print(i, end=" ")
print(type(i))
他返回的迭代对象都是元组。
(1, 2) <class ‘tuple’>
(1, 3) <class ‘tuple’>
(2, 1) <class ‘tuple’>
(2, 3) <class ‘tuple’>
(3, 1) <class ‘tuple’>
(3, 2) <class ‘tuple’>
二、算法
思考
实现算法前我们思考两个问题。
1.permutations函数返回的迭代序列有什么特点?
通过上面的例子我们知道,它返回的迭代序列是按接收进来序列元素的顺序进行迭代的。
如果要让大家写出一个数列的全部排列,那么你们会怎么写呢?我先说我,我是这样数的。以[1,2,3,4]为例,先选择第一个元素(1),然后选择(1)的下一个元素(2),然后选(2)的下个元素(3)··· 选下个元素(4),选了(4)之后,因为已经选了4个元素,长度与传入的序列([1, 2, 3, 4])等长了,所以得到第一个元组(1, 2, 3, 4)。继续,回到上一步(3),(3)因为下一个元素只有(4),而(4)已经选过了,所以就不能再选了。然后再回一步,回到(2),(2)的下一个元素是(3),而(3)已经选过了,所以就选(4),选了(4)之后,现在还剩(3)没选,所以就选(3),选了之后得到第二个元组(1, 2, 4, 3),(2)后面数完了之后就从(3)开始数(此时的序列为(1, 3))···省略···然后遍历到以(4)作为第一个元素···省略···最后得出最终结果。
我想,应该不少人数这用数列都是按这种顺序来数的吧。反正我高中有时候遇到简单一点的排列组合的填空选择题,懒得用A,C那些计算就会用类似这种但低级一点的方法去数。其实这种数法有个专有名词叫深度优先遍历 (Depth First Search) 简称 DFS。
2.permutations函数返回的迭代序列有会重复吗?
通过上面的例子发现,返回的迭代序列没有重复的。但是,当传入的序列里边存在相同元素时,会生成重复的元组。
for i in itertools.permutations([1, 1, 2]):
print(i, end=" ")
的结果是
(1, 1, 2) (1, 2, 1) (1, 1, 2) (1, 2, 1) (2, 1, 1) (2, 1, 1)
可以看到产生了重复的元组(1, 1, 2), (1, 2, 1), (2, 1, 1)
而在实际应用中我们一般不需要重复的元素,因此需要去重。最简单的做法就是使用集合去重,但在时间和空间复杂度上讲,这样不可行。在处理海量数据时,如果先遍历出全部结果再用集合去重的话会产生大量重复分支,大大降低执行效率,严重还可能出现卡顿现象。所以我们需要剪枝,而且是在没有生成的时候将其去除。
优化
permutations函数对存在相同元素的列表或元组使用时会产生重复元素, 我们应使用更高效的方法对返回的元素去重。
思路
剪枝:如果此元素与上一元素相等且上一元素未使用,需要剪枝去除。
**注意:**gif里面忘说了。需要先对原数组进行排序,否则剪枝功能会失效。
三、完整代码
最后
🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!