如何用Python生成二进制字符串指定索引位翻转的所有组合?
生成二进制字符串指定位翻转的所有组合
我有一个二进制字符串和一组需要翻转的比特位索引列表,想要生成该二进制字符串在这些指定索引位进行翻转的所有可能组合。输出列表需要包含2^n个唯一元素,n是索引列表的长度。我觉得可以用itertools.product()实现,但不确定怎么设置参数,尤其是索引列表长度不固定的情况。
示例
binaryString = "0000000000" indicesToFlip = [0,1,9] outputCombinations = magic() print(outputCombinations) # 输出结果: ["0000000000", "1000000000", "0100000000", "1100000000", "0000000001", "0100000001", "1000000001", "1100000001"]
解决方案
用itertools.product()完全能搞定这个需求,核心思路是:每个指定索引都有两种状态——翻转或不翻转,我们用product生成所有状态的组合,再逐个对原始字符串进行修改即可。
具体实现步骤
- 把二进制字符串转成列表:字符串是不可变类型,转成列表后方便修改指定位置的字符。
- 生成所有翻转组合:调用
itertools.product([False, True], repeat=len(indicesToFlip)),这里repeat参数设为索引列表的长度,就能生成2^n种不同的翻转决策(每个决策是一个元组,比如(True, False, True)表示翻转第一个和第三个索引位)。 - 遍历每个翻转决策:
- 每次都复制原始的二进制列表,避免修改原数据影响后续迭代。
- 对每个索引和对应的翻转标记,若标记为
True,就把该位置的字符翻转(0变1,1变0)。 - 把修改后的列表转回字符串,加入结果列表。
完整代码
import itertools def magic(binary_str, indices): # 转成列表方便修改 original = list(binary_str) result = [] # 生成所有翻转组合:每个位置有翻或不翻两种选择 flip_combinations = itertools.product([False, True], repeat=len(indices)) for flips in flip_combinations: # 复制原始列表 current = original.copy() for idx, flip in zip(indices, flips): if flip: # 翻转该位:0变1,1变0 current[idx] = '1' if current[idx] == '0' else '0' # 转回字符串加入结果 result.append(''.join(current)) return result # 测试示例 binaryString = "0000000000" indicesToFlip = [0,1,9] outputCombinations = magic(binaryString, indicesToFlip) print(outputCombinations)
运行这段代码就能得到示例里的输出结果,而且不管索引列表长度是多少,都能自动生成2^n种唯一组合。
内容的提问来源于stack exchange,提问作者fariadantes
相关产品推荐
相关产品推荐

