Python内置库itertools生成穷举字典
Posted 二毛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python内置库itertools生成穷举字典相关的知识,希望对你有一定的参考价值。
背景
测试某活动页面接口参数是否可穷举。
需求
生成一个由0123456789ABCDEF组成的、固定位数的字符串,并穷举所有可能的结果。
思路
- for循环嵌套
- 优点:好理解
- 缺点:要多少位就需要多少个循环嵌套,麻烦,且占内存。
- 导入第三方工具生成的字典
- 优点:直接使用,不用随时生成
- 缺点:需要第三方工具生成,且导入之后占内存
最终方案
Python自带的itertools迭代器,可以直接生成所需字典。
- 优点:高效、省内存(所谓“惰性计算”,就是在循环到某一字符的时候才计算到该字符,不会提前计算完所有数据存储在内存中。)
缺点:我居然才知道
itertools的几个可能有用的方法
itertools.accumulate(iterable [, func])
默认返回一个累加序列,设定func可以返回累乘等其他计算。import itertools data = [1, 2, 3, 4] a = itertools.accumulate(data) for aa in a: print(aa)
输出
1 3 6 10
itertools.chain(*iterables)
需要连续遍历多个序列时可以用这个。a = [1, 2, 3] b = [4, 5, 6] c = itertools.chain(a, b) print(list(c))
输出
[1, 2, 3, 4, 5, 6]
itertools.combinations(*iterable, r*)
就是数学中的组合数,数学符号$C_m^n$,其中m为传入序列的元素个数,n为传入的第二个参数。c = itertools.combinations(\'ABC\', 2) print(list(c))
输出
[(\'A\', \'B\'), (\'A\', \'C\'), (\'B\', \'C\')]
itertools.permutations(iterable, r)
就是数学中的排列数,数学符号$A_m^n$,其中m为传入序列的元素个数,n为传入的第二个参数。c = itertools.permutations(\'ABC\', 3) print(list(c))
输出
[(\'A\', \'B\', \'C\'), (\'A\', \'C\', \'B\'), (\'B\', \'A\', \'C\'), (\'B\', \'C\', \'A\'), (\'C\', \'A\', \'B\'), (\'C\', \'B\', \'A\')]
itertools.product(iterable, repeat=1)
本次使用的方法。
可以生成一个穷举序列,第一个参数为序列组成元素,四二个参数 repeat=2表示穷举两位。c = itertools.product(\'123\', repeat=2) # print(list(c)) for i in c: print(\'\'.join(i))
输出
11 12 13 21 22 23 31 32 33
结局
c = itertools.product(\'0123456789ABCDEF\', repeat=8) # print(list(c)) for i in c: print(\'\'.join(i))
由此可以生成8位穷举字典。
由0123456789ABCDEF组成的8位穷举字典共有$16^8$个,也就是4294967296,接近43亿。所以8位几乎没有可能成功了
虽然成功生成穷举字典,但是目标参数是64位的,要是穷举完,需要1.158E+77次。
以上是关于Python内置库itertools生成穷举字典的主要内容,如果未能解决你的问题,请参考以下文章