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

标签 python python-itertools cartesian-product

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

我列出了每个位为 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

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]

关于python - 具有固定值的 Itertools 二进制列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69273272/

相关文章:

python - Itertools 不可调用

python - 进行可能的组合?

python - Scala 相当于 python itertools 'cycle'

python - random.sample 中使用的常数的证明

python - pytesseract 努力识别带有字体编号和 7 段数字的干净黑白图片(python)

python - 如何更有效地将分号分隔的列转换为 0/1/2 指示矩阵?

c# - 从 2 个表中选择行的所有组合

php - 受限笛卡尔积计算 - PHP

python - 列表字典的笛卡尔积作为项目

python - 在 TensorFlow 中定义成本/损失函数