枚举python列表理解中的三个变量

时间:2016-01-18 11:21:20

标签: python list-comprehension

我正在尝试打印三个变量列表的所有可能枚举。例如,如果我的输入是:

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)]

我认为范围功能有问题吗?

4 个答案:

答案 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 ...]

但请注意,这显然只有三个变量(xyz),而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]])))