我正在尝试打印三个变量列表的所有可能枚举。例如,如果我的输入是:
x = 1
y = 1
z = 1
我希望输出如下:
[[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 0], [1, 0, 1], [0, 1, 1], [1, 1, 1]]
如果x,y,z变量中的任何一个高于1,它将枚举从0到变量值的所有整数。例如,如果x = 3,则在3元素列表的第一个时隙中可以使用0,1,2或3。
现在我正在创建这样的列表理解:
output = [ [x,y,z] for x,y,z in range(x,y,z)]
我认为范围功能有问题吗?
答案 0 :(得分:15)
您可以使用product()
中的itertools
功能,如下所示:
from itertools import product
answer = list(list(x) for x in product([0, 1], repeat=3))
print(answer)
<强>输出强>
[[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 :(得分:8)
使用product
补充解决方案,您还可以使用三重列表理解。
>>> x, y, z = 1, 2, 3
>>> [(a, b, c) for a in range(x+1) for b in range(y+1) for c in range(z+1)]
[(0, 0, 0),
(0, 0, 1),
(0, 0, 2),
(some more),
(1, 2, 2),
(1, 2, 3)]
+1
是必要的,因为range
不包括上限。
如果您希望输出为列表列表,则可以执行[[a, b, c] for ...]
。
但请注意,这显然只有三个变量(x
,y
,z
),而product
可以任意使用列表数/上限。
答案 2 :(得分:6)
您可以在列表理解和range()
函数中使用itertools.product
函数:
>>> x = 1
>>> y = 1
>>> z = 1
>>> from itertools import product
>>> list(product(*[range(i+1) for i in [x,y,z]]))
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
这种方法也适用于不同的数字:
>>> x = 2
>>> y = 2
>>> z = 2
>>>
>>> list(product(*[range(i+1) for i in [x,y,z]]))
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 2, 0), (0, 2, 1), (0, 2, 2), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 2, 0), (1, 2, 1), (1, 2, 2), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 2, 0), (2, 2, 1), (2, 2, 2)]
>>>
答案 3 :(得分:4)
如果您需要以列表形式(而不是元组列表)的形式,您可以使用map
覆盖Kasramvd的答案输出,即:
map(list,list(product(*[range(i+1) for i in [x,y,z]])))