【问题标题】:Itertools binary list with fixed values具有固定值的 Itertools 二进制列表
【发布时间】:2021-11-15 06:34:55
【问题描述】:

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

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

【问题讨论】:

    标签: python itertools cartesian-product


    【解决方案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]
    

    【讨论】:

      【解决方案2】:

      你需要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
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-20
        • 2014-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多