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

In Python, how do I generate all permutations of a string of 0s and 1s in order?

我正在尝试排列任意长度的 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

等等

我只是想不出一个算法,谁能帮我?

编辑:弹出提示我可以在此站点的其他地方找到答案。我是新来的,所以我可能理解不正确,但我在这两个问题中看到的唯一重叠是排列这个词。

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

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 创建集合的所有 k 元素子集 l `{0, 1, ..., n-1} 并将每个子集转换为二进制字。此翻译的工作原理是为 l 的每个元素放置一个 1,并计算中间必须有多少个零。前导和尾随零必须是特殊大小写。

示例输出: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)]