我试图在列表中迭代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深的嵌套循环,即使是这样一个简单的循环,仍然是一个怪物。
答案 0 :(得分:12)
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']]