2

我想生成一个列表列表,代表数字 0 和 1 的所有可能组合。列表的长度为 n。

输出应如下所示。对于 n=1:

[ [0], [1] ]

对于 n=2:

[ [0,0], [0, 1], [1,0], [1, 1] ]

对于 n=3:

[ [0,0,0], [0, 0, 1], [0, 1, 1]... [1, 1, 1] ]

我查看了 itertools.combinations 但这会产生元组,而不是列表。[0,1] 和 [1,0] 是不同的组合,而只有一个元组 (0,1) (顺序无关紧要)。

有什么提示或建议吗?我尝试了一些递归技术,但我还没有找到解决方案。

4

4 回答 4

4

你正在寻找itertools.product(...).

>>> from itertools import product
>>> list(product([1, 0], repeat=2))
[(1, 1), (1, 0), (0, 1), (0, 0)]

如果要将内部元素转换为list类型,请使用列表推导

>>> [list(elem) for elem in product([1, 0], repeat =2)]
[[1, 1], [1, 0], [0, 1], [0, 0]]

或者通过使用map()

>>> map(list, product([1, 0], repeat=2))
[[1, 1], [1, 0], [0, 1], [0, 0]]
于 2013-07-28T16:33:10.450 回答
2

使用itertools.product,将 分配repeat给 n。

from itertools import product
list(product([0,1], repeat=n))

演示:

>>> list(product([0,1], repeat=2))
[(0, 0), (0, 1), (1, 0), (1, 1)]
>>> list(product([0,1], repeat=3))
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
于 2013-07-28T16:34:40.970 回答
2
>>> from itertools import product
>>> list(product([0, 1], repeat=2))
[(0, 0), (0, 1), (1, 0), (1, 1)]
>>> 
>>> list(product([0, 1], repeat=3))
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]

要获取列表列表,您可以执行以下操作:

>>> map(list, list(product([0, 1], repeat=2)))
[[0, 0], [0, 1], [1, 0], [1, 1]]
于 2013-07-28T16:35:49.433 回答
1

只是为了增加一点多样性,这是实现这一目标的另一种方法:

>>> [map(int, format(i, "03b")) for i in range(8)]
[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]
于 2013-07-28T17:53:33.000 回答