交换二进制数列表,但仅x个长度

时间:2019-01-22 05:16:32

标签: python

我在简化脚本方面遇到困难。我目前所生成的数组列表具有所有可能的组合(考虑到二进制字符串中的位数),消除了其组合值超过我需要交换的位数的列表,然后生成了其绝对减数的列表价值观。

例如:

如果我提供“ 101”,它将创建列表: [1,0,1]

然后询问我要交换多少。 如果我说“ 2”

它将采用原始list(3)的长度,并为该长度生成所有可能的二进制组合: ([0,0,0][1,0,0][0,1,0][0,0,1][1,1,0][1,0,1][0,1,1][1,1,1])

然后将消除那些合并值不等于“ 2”的值: ([1,1,0][1,0,1][0,1,1]) ,从原始列表中减去它们的值,取绝对值,给我: ([0,1,1][0,0,0][1,1,0])

现在,这很好...如果我坚持使用固定长度的小值,但是我正在使用不同长度的二进制数,并且需要交换不同数目的值(最多500个,这将花费更多)比我的生命产生)。我已经看到一些此处的用户提出了一些非常优雅而简单的解决方案,并希望有人能够帮助我将这一代码简化为几行代码。

1 个答案:

答案 0 :(得分:0)

itertools.combinations在这里特别方便-我们可以告诉它给我们N个索引的组合以进行翻转,然后依次翻转每个索引。

下面是使用itertools和生成器函数的示例:

import itertools

def n_indices_flipped(sequence, n):
  for indices_to_flip in itertools.combinations(range(len(sequence)), n):
    item = sequence[:]
    for index in indices_to_flip:
      # flip 0 to 1 or vice versa
      item[index] = 1 - item[index]
    yield item

# Usage:
all_flipped_variants = list(n_flipped([1, 0, 1], 2))
print(all_flipped_variants)
# prints [[0, 1, 1], [0, 0, 0], [1, 1, 0]]