在Python中制作一个包含0和1的每种可能组合的列表

时间:2014-01-07 02:22:40

标签: python

我试图在列表中迭代0和1的每个可能组合。例如,如果我使用3个参数,我会得到:

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

我认为Array combinations of 0s and 1s上的解决方案由于存储我需要的长度二进制数的问题而不合适。我希望能够以20或更长的长度迭代这样的列表,其中纯粹的大小变得难以处理整数。我一直在使用这样的代码:

for a in [0, 1]:
   for b in [0, 1]:
       for c in [0, 1]:
          print([a, b, c])

有更多Pythonic或快速的东西吗?一个20深的嵌套循环,即使是这样一个简单的循环,仍然是一个怪物。

3 个答案:

答案 0 :(得分:12)

使用itertools.product

import itertools

for numbers in itertools.product([0, 1], repeat=3):
    print(numbers)

输出:

(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)

答案 1 :(得分:2)

您正在寻找cartesian product

对于少数笛卡尔积,你可以使用这种类型的列表理解:

>>> [(a,b,c) for a in (0,1) for b in (0,1) for c in (0,1)]
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]

对于多个(例如超过4个),您应该使用falsetru's方法。

答案 2 :(得分:2)

另一种选择,你可以用二进制数来计算:

['{:03b}'.format(x) for x in range(8)]
Out[10]: ['000', '001', '010', '011', '100', '101', '110', '111']

如果你确实需要他们成为名单:

[list('{:03b}'.format(x)) for x in range(8)]
Out[12]: 
[['0', '0', '0'],
 ['0', '0', '1'],
 ['0', '1', '0'],
 ['0', '1', '1'],
 ['1', '0', '0'],
 ['1', '0', '1'],
 ['1', '1', '0'],
 ['1', '1', '1']]