python itertools模块实现排列组合
在使用python写一个简单字典密码生成器的时候,了解到了itertools模块和笛卡尔积(一个数学生成式)。发现其对于字典生成太有帮助了。
一、你会怎么写?
如果不考虑这个模块自身,我们自己来实现,会怎么实现一个字典生成功能呢?看下我写的一个示例代码:
1#!/usr/bin/env python
2# code from www.361way.com
3import string
4basestring = string.ascii_lowercase + string.digits
5for s1 in string.ascii_lowercase:
6 for s2 in basestring:
7 print (s1 + s2)
但是上面只是针对,两位的字符串组合,如果是三位、四位、五位……呢?—– 写一个基于两位的函数,然后在这个基础循环,还是通过random.choice模块随机选择?貌似可以随机进行选择,但是肯定会产生重复值,而且也不一定能random出所有值 。接下来看下itertools的使用。
二、笛卡尔积:itertools.product(*iterables[, repeat])
直接对自身进行笛卡尔积:
1import itertools
2for i in itertools.product('ABCD', repeat = 2):
3 print (''.join(i),end=' ')
输出结果: AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD
print (”.join(i))这个语句可以让结果直接排列到一起
end=’ ‘可以让默认的输出后换行变为一个空格。
两个元组进行笛卡尔积:
1import itertools
2a = (1, 2, 3)
3b = ('A', 'B', 'C')
4c = itertools.product(a,b)
5for i in c:
6 print(i,end=' ')
输出结果: (1, ‘A’) (1, ‘B’) (1, ‘C’) (2, ‘A’) (2, ‘B’) (2, ‘C’) (3, ‘A’) (3, ‘B’) (3, ‘C’)
三、排列:itertools.permutations(iterable[, r])
1import itertools
2for i in itertools.permutations('ABCD', 2):
3 print (''.join(i),end=' ')
输出结果: AB AC AD BA BC BD CA CB CD DA DB DC
四、组合:itertools.combinations(iterable, r)
1import itertools
2for i in itertools.combinations('ABCD', 3):
3 print (''.join(i))
4
5输出结果:
6ABC
7ABD
8ACD
9BCD
五、组合(包含自身重复):itertools.combinations_with_replacement(iterable, r)
1import itertools
2for i in itertools.combinations_with_replacement('ABCD', 3):
3 print (''.join(i),end=' ')
输出结果: AAA AAB AAC AAD ABB ABC ABD ACC ACD ADD BBB BBC BBD BCC BCD BDD CCC CCD CDD DDD
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/python-itertools/5705.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.