我正在处理一些事情,其中有2个 n 可能的结果,我需要以二进制方式迭代。
我想要某种二进制enumeration或类似的东西,我可以用来在每次迭代中打开和关闭运算符和/或函数。
符号(或+/-运算符)更改超过2 3 = 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
二叉树的排序,但是作为代码结构而不是数据结构?
是否有帮助内置?
答案 0 :(得分:7)
只需生成二进制标志的产品;如果您需要切换3个不同的东西,请生成(False, True)
三次的产品:
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
答案 1 :(得分:1)
作为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])