Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 交换二进制数列表,但仅交换x长度_Python - Fatal编程技术网

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

Python 交换二进制数列表,但仅交换x长度,python,Python,我很难简化脚本。我目前生成的数组列表包含所有可能的组合(给定二进制字符串中的位数),消除组合值超过需要交换的位数的列表,然后生成其绝对减去值的列表 例如: 如果我提供“101”,它将创建以下列表: [1,0,1] 然后它会问我想换多少。 如果我说“2” 它将采用原始列表(3)的长度,并为该长度生成所有可能的二进制组合: ([0,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]

我很难简化脚本。我目前生成的数组列表包含所有可能的组合(给定二进制字符串中的位数),消除组合值超过需要交换的位数的列表,然后生成其绝对减去值的列表

例如:

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

然后它会问我想换多少。 如果我说“2”

它将采用原始列表(3)的长度,并为该长度生成所有可能的二进制组合:
([0,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个,这将花费我一生的时间来生成)。我已经看到一些用户提出的非常优雅和简单的解决方案,希望有人能帮助我将这个简化为几行代码

itertools.compositions
在这里特别方便-我们可以告诉它给我们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]]

谢谢你,Amber。这是完美的,正是我想要的。比我使用的文字代码简单得多。我过去曾遇到过itertools,但从未真正研究过它。看起来我还有更多的研究要做:)请注意,对于更大的序列和更大的翻转次数,这仍然会开始非常快地减慢-这只是因为n-pick-k组合的数量增长非常快-
n!/(k!*(n-k)!
事实上。因此,对于真正更大的数字来说,它永远不会很快。但希望这在中端会稍微有点效率。告诉我lol,我不得不隔离一台单独的机器来生成这些列表。目前大约有30GB的容量。一旦一切都说了算,应该需要一个月左右的时间。@Amber-很好的解决方案提问者在文章的前几段解释了他们已经尝试过的内容。我认为他们不需要为这个问题受到警告。对我来说,这听起来像是一个家庭作业问题。@StefanBecker家庭作业问题只要“包括你迄今为止为解决问题所做工作的摘要,以及你解决问题的难度的描述。”-这是一个问题。