【问题标题】:Pythonic way to iterate and/or enumerate with a binary 'switch'使用二进制“开关”进行迭代和/或枚举的 Pythonic 方式
【发布时间】:2016-05-20 09:00:28
【问题描述】:

我目前正在处理一些事情,我需要以二进制方式迭代 2n 个可能的结果。

我想要某种二进制 enumeration 或类似的东西,我可以用它来在每次迭代中打开和关闭运算符和/或函数。

符号(或 +/- 运算符)在 23=8 次迭代中发生变化的示例可能是:

loop1: + var1 + var2 + var3
loop2: + var1 + var2 - var3
loop3: + var1 - var2 + var3
loop4: + var1 - var2 - var3
loop5: - var1 + var2 + var3
loop6: - var1 + var2 - var3
loop7: - var1 - var2 + var3
loop8: - var1 - var2 - var3

类似于二叉树,但作为代码结构而不是数据结构?

是否有有用的内置函数?

【问题讨论】:

    标签: python loops iterator


    【解决方案1】:

    只产生二进制标志的乘积;如果需要切换 3 个不同的东西,生成 (False, True) 的乘积 3 次:

    from itertools import product
    
    for first, second, third in product((False, True), repeat=3):
    

    你也可以生产运营商的产品;你的样本可以使用operator module functions:

    import operator
    from itertools import product
    
    unary_op = operator.pos, operator.neg
    
    for ops in product(unary_op, repeat=3):
        result = sum(op(var) for op, var in zip(ops, (var1, var2, var3)))
    

    演示:

    >>> from itertools import product
    >>> import operator
    >>> var1, var2, var3 = 42, 13, 81
    >>> unary_op = operator.pos, operator.neg
    >>> for ops in product(unary_op, repeat=3):
    ...     vars = [op(var) for op, var in zip(ops, (var1, var2, var3))]
    ...     print('{:=3d} + {:=3d} + {:=3d} = {sum:=4d}'.format(*vars, sum=sum(vars)))
    ...
     42 +  13 +  81 =  136
     42 +  13 + -81 = - 26
     42 + -13 +  81 =  110
     42 + -13 + -81 = - 52
    -42 +  13 +  81 =   52
    -42 +  13 + -81 = -110
    -42 + -13 +  81 =   26
    -42 + -13 + -81 = -136
    

    【讨论】:

      【解决方案2】:

      作为一种 Numpythonic 方法,您可以创建长度为 3 的所有 [1, -1] 乘积,然后将其与变量相乘,然后将结果相加。在 Numpy 中,您可以通过以下两个步骤来完成:

      perm = np.vstack((np.repeat(a, 4), np.tile(np.repeat(a, 2), 2), np.tile(a, 4))).T
      (perm * (var1, var2, var3)).sum(axis=1)
      

      演示:

      >>> var1 = 5
      >>> var2 = 7
      >>> var3 = 2
      >>> a = np.array([ 1, -1])
      >>> perm = np.vstack((np.repeat(a, 4), np.tile(np.repeat(a, 2), 2), np.tile(a, 4))).T
      >>> 
      >>> perm * (var1, var2, var3)
      array([[ 5,  7,  2],
             [ 5,  7, -2],
             [ 5, -7,  2],
             [ 5, -7, -2],
             [-5,  7,  2],
             [-5,  7, -2],
             [-5, -7,  2],
             [-5, -7, -2]])
      >>> 
      
      >>> (perm * (var1, var2, var3)).sum(axis=1)
      array([ 14,  10,   0,  -4,   4,   0, -10, -14])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-13
        • 2018-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多