具有固定值的 Itertools 二进制列表

Itertools binary list with fixed values

我有一些原始二进制文件,但由于读取错误,我不确定其中的某些位。

我列出了每个位为 1 或 0 的频率。有些位总是 0 或 1,但有些很难确定。与下面示例不同的真实列表有 255 个项目。只有10位不确定,感觉可以暴力破解

[ 0.0, 0.35555555555555557, 1.0, 1.0, 0.4388888888888889, 0.0, 0.35555555555555557, 1.0]

x为不确定值,f为固定值。

[ f, x, f, f, x, f, x, f]

我如何使用 itertools 获取 x 可能为 0 或 1 的每个组合,输出可能性列表同时保持已知值固定?

[ 0, 0, 1, 1, 0, 0, 0, 1]
[ 0, 1, 1, 1, 0, 0, 0, 1]
...
[ 0, 1, 1, 1, 1, 0, 1, 1]

你需要itertools.product

代码示例:

from itertools import product

a = [ 0.0, 0.35555555555555557, 1.0, 1.0, 0.4388888888888889, 0.0, 0.35555555555555557, 1.0]
m = [i for i, v in enumerate(a) if v not in (0.0, 1.0)]

for v in product((0.0, 1.0), repeat=len(m)):
    for i in range(len(m)):
        a[m[i]] = v[i]
    print(a)  # iterate over combinations

您可以创建一个错误索引列表,然后使用 itertools.product 生成这些索引处所有可能的位组合:

from itertools import product

def possible_patterns(data):
    bad_indices = [i for i, bit in enumerate(data) if bit not in [0, 1]]

    for replacement in product([0, 1], repeat=len(bad_indices)):
        for index, bit in zip(bad_indices, replacement):
            data[index] = bit
        yield data
        
data = [ 0.0, 0.35555555555555557, 1.0, 1.0, 0.4388888888888889, 0.0, 0.35555555555555557, 1.0]

for pattern in possible_patterns(data):
    print(pattern)

输出:

[0.0, 0, 1.0, 1.0, 0, 0.0, 0, 1.0]
[0.0, 0, 1.0, 1.0, 0, 0.0, 1, 1.0]
[0.0, 0, 1.0, 1.0, 1, 0.0, 0, 1.0]
[0.0, 0, 1.0, 1.0, 1, 0.0, 1, 1.0]
[0.0, 1, 1.0, 1.0, 0, 0.0, 0, 1.0]
[0.0, 1, 1.0, 1.0, 0, 0.0, 1, 1.0]
[0.0, 1, 1.0, 1.0, 1, 0.0, 0, 1.0]
[0.0, 1, 1.0, 1.0, 1, 0.0, 1, 1.0]