python itertools

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

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

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

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

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

六、面试资料

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

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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里面忘说了。需要先对原数组进行排序,否则剪枝功能会失效。

三、完整代码


自定义Itertools函数

class MyItertools:

使用默认参数L用于定义输出长度

def permutations(self, nums, L=-1):

当传有长度参数且长度参数符合逻辑时,我们使用传入的参数作为返回长度,否则直接使用列表nums长度作为返回长度

L = len(nums) if L <= 0 or L > len(nums) else L

nums.sort()

定义等长标记数组

used = [False for i in nums]

用于存储每一个输出结果

result = []

def dfs(res):

终止条件

if len(res) == L:

result.append(res)

return

enumerate函数:同时返回元素的下标和值

for i, val in enumerate(nums):

如果此元素使用过了直接跳过

if used[i]:

文末有福利领取哦~

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

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

👉二、Python必备开发工具

img
👉三、Python视频合集

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

👉 四、实战案例

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

👉五、Python练习题

检查学习结果。
img

👉六、面试资料

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

img

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值