在Python中,如何按顺序生成0和1的字符串的所有排列?

时间:2017-03-16 00:31:39

标签: numpy permutation bits

我试图置换一个任意长度的0和1的字符串。我已经看到很多关于这个主题的答案,以便长度为n的字符串的结果对于n=3将是这样的。

000
001
010
011
100
101
110
111

但这不是我需要的!

我需要它长度为3:

000
100
010
001
110
101
011
111

长度为4时,这将是:

0000
1000
0100
0010
0001
1100
1010
1001
0110
0101
0011
1110
1101
1011
0111
1111

对于长度5,它将是:

00000
10000
01000
00100
00010
00001
11000
10100
10010
10001
01100
01010
01001
00110
00101
00011
11100
11010
11001
10110
10101
10011
01110
01101
01011
00111
11110
11101
11011
10111
01111
11111

等。

我无法为此找出算法,任何人都可以帮助我吗?

编辑:我弹出窗口表示我可以在本网站的其他地方找到答案。我是新来的,所以我可能听不懂,但我在两个问题中看到的唯一重叠是排列这个词。

1 个答案:

答案 0 :(得分:1)

这对我有用。但是,它确实不按顺序生成元素,而是首先生成它们然后对它们进行排序。

n = 5
i = np.array(np.indices(n * (2,))).reshape(n, -1)
i[:, np.argsort(i.sum(0)[::-1], kind='mergesort')].T[::-1]

它使用稳定的排序对二进制单词的数字进行排序,即在平局的情况下保留原始顺序。

可以使用itertools

构建按顺序生成单词的解决方案
itertools.chain((n*(0,),), (l[0] * (0,) + sum(((1,) + (i-j-1) * (0,) for i, j in zip(l[1:], l[:-1])), ()) + (1,) + (n-l[-1]-1)*(0,) for k in range(1,n+1) for l in itertools.combinations(range(n), k)))

这循环超过 k 的数量( k = 0是特殊的,并使用itertools.chain预先添加)。对于每个 k ,它使用itertools.combinations来创建集合`{0,1,...的所有 k 元素子集 l 。 , n -1}并将每个子集转换为二进制字。这个翻译的工作原理是为 l 的每个元素添加一个,并计算它们之间必须有多少个零。前导和尾随的零必须是特殊的。

示例输出:numpy

# array([[0, 0, 0, 0, 0], [1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0],
         [0, 0, 0, 1, 0], [0, 0, 0, 0, 1], [1, 1, 0, 0, 0], [1, 0, 1, 0, 0],
         [1, 0, 0, 1, 0], [1, 0, 0, 0, 1], [0, 1, 1, 0, 0], [0, 1, 0, 1, 0],
         [0, 1, 0, 0, 1], [0, 0, 1, 1, 0], [0, 0, 1, 0, 1], [0, 0, 0, 1, 1],
         [1, 1, 1, 0, 0], [1, 1, 0, 1, 0], [1, 1, 0, 0, 1], [1, 0, 1, 1, 0],
         [1, 0, 1, 0, 1], [1, 0, 0, 1, 1], [0, 1, 1, 1, 0], [0, 1, 1, 0, 1],
         [0, 1, 0, 1, 1], [0, 0, 1, 1, 1], [1, 1, 1, 1, 0], [1, 1, 1, 0, 1],
         [1, 1, 0, 1, 1], [1, 0, 1, 1, 1], [0, 1, 1, 1, 1], [1, 1, 1, 1, 1]])

itertools

list(_)
# [(0, 0, 0, 0, 0), (1, 0, 0, 0, 0), (0, 1, 0, 0, 0), (0, 0, 1, 0, 0), (0, 0, 0, 1, 0), (0, 0, 0, 0, 1),
   (1, 1, 0, 0, 0), (1, 0, 1, 0, 0), (1, 0, 0, 1, 0), (1, 0, 0, 0, 1), (0, 1, 1, 0, 0), (0, 1, 0, 1, 0),
   (0, 1, 0, 0, 1), (0, 0, 1, 1, 0), (0, 0, 1, 0, 1), (0, 0, 0, 1, 1), (1, 1, 1, 0, 0), (1, 1, 0, 1, 0),
   (1, 1, 0, 0, 1), (1, 0, 1, 1, 0), (1, 0, 1, 0, 1), (1, 0, 0, 1, 1), (0, 1, 1, 1, 0), (0, 1, 1, 0, 1),
   (0, 1, 0, 1, 1), (0, 0, 1, 1, 1), (1, 1, 1, 1, 0), (1, 1, 1, 0, 1), (1, 1, 0, 1, 1), (1, 0, 1, 1, 1),
   (0, 1, 1, 1, 1), (1, 1, 1, 1, 1)]