如何使用itertools生成含固定值二进制列表的不确定位全组合
实现方案
核心思路
- 先根据输入的频率列表生成基础模板,同时记录所有不确定位(x)的索引位置
- 调用
itertools.product生成所有不确定位的0/1取值组合(n个不确定位对应2^n种组合,10个不确定位仅1024种,性能完全可控) - 遍历每个取值组合,将对应值填充到基础模板的不确定位位置,输出完整的二进制列表
代码实现
import itertools def generate_all_binary(freq_list): # 生成基础模板和不确定位索引 base = [] x_indexes = [] for idx, freq in enumerate(freq_list): if freq == 0.0: base.append(0) elif freq == 1.0: base.append(1) else: # 不确定位先占位,后续填充 base.append(None) x_indexes.append(idx) # 生成所有不确定位的取值组合 for x_values in itertools.product([0, 1], repeat=len(x_indexes)): res = base.copy() # 填充不确定位 for idx, val in zip(x_indexes, x_values): res[idx] = val yield res # 示例测试 if __name__ == "__main__": test_freq = [0.0, 0.35555555555555557, 1.0, 1.0, 0.4388888888888889, 0.0, 0.35555555555555557, 1.0] for binary_list in generate_all_binary(test_freq): print(binary_list)
效果说明
以上测试代码运行后会输出8组(对应3个不确定位,2^3=8)符合要求的二进制列表,和你给出的示例输出完全匹配。针对255位长度、10个不确定位的场景,该函数会返回1024组符合要求的二进制列表,通过生成器逐次返回结果,不需要一次性存储所有组合,内存占用极低。
内容的提问来源于stack exchange,提问作者Wiper
相关产品推荐
相关产品推荐

