2024年最新python itertools,字节跳动视频面试难吗

文末有福利领取哦~

👉一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。img

👉二、Python必备开发工具

img
👉三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
img

👉 四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
img

👉五、Python练习题

检查学习结果。
img

👉六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
img

img

👉因篇幅有限,仅展示部分资料,这份完整版的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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值