使用二进制 'switch' 进行迭代和/或枚举的 Pythonic 方法

标签 python loops iterator

目前我正在处理一些事情,我需要以二进制方式迭代 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

有点像二叉树,但作为代码结构而不是数据结构?

是否有有用的内置函数?

最佳答案

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

from itertools import product

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

也可以生产运营商的产品;你的 sample 可以使用 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

关于使用二进制 'switch' 进行迭代和/或枚举的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37342396/

相关文章:

python - Python 协议(protocol)/接口(interface)的综合列表

php - 在 PHP 中循环访问单个服务器上的 MySQL 数据库

xml - 使用 groovy 从上到下遍历 xml 文件

C++ std::vector 迭代器行为奇怪,不允许递增

c++ - VC++的迭代器声明

python - 从 wxPython WebView 得到奇怪的结果

python - 合并共享共同元素的列表

python - 使用两个字典映射列

php - 如何根据项目的组和数量生成列?

c++ - 使用迭代器隐藏内部容器并实现对基础容器的通用操作