具有固定值的 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]
我有一些原始二进制文件,但由于读取错误,我不确定其中的某些位。
我列出了每个位为 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]