Python内置库itertools生成穷举字典

Posted 二毛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python内置库itertools生成穷举字典相关的知识,希望对你有一定的参考价值。

背景

测试某活动页面接口参数是否可穷举。

需求

生成一个由0123456789ABCDEF组成的、固定位数的字符串,并穷举所有可能的结果。

思路

  1. for循环嵌套
  2. 优点:好理解
  3. 缺点:要多少位就需要多少个循环嵌套,麻烦,且占内存。
  4. 导入第三方工具生成的字典
  5. 优点:直接使用,不用随时生成
  6. 缺点:需要第三方工具生成,且导入之后占内存

最终方案

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生成穷举字典的主要内容,如果未能解决你的问题,请参考以下文章

python标准库之itertools

itertools内置库

python 相见恨晚的itertools库

python模块分析之itertools

itertools库

python内置函数itertools