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

Wil*_*oss 12 python list-comprehension

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

x = 1
y = 1
z = 1
Run Code Online (Sandbox Code Playgroud)

我希望输出如下:

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 0], [1, 0, 1], [0, 1, 1], [1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)

如果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)]
Run Code Online (Sandbox Code Playgroud)

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

gtl*_*ert 15

您可以使用以下product()函数itertools:

from itertools import product

answer = list(list(x) for x in product([0, 1], repeat=3))
print(answer)
Run Code Online (Sandbox Code Playgroud)

产量

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)


tob*_*s_k 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)]
Run Code Online (Sandbox Code Playgroud)

+1是必要的,因为range不包括上限.如果您希望输出是列表列表,您可以这样做[[a, b, c] for ...].

但是请注意,这显然会唯一的工作就是你总是有三个变量(x,y,z),同时product将与列表/上限的任意数量的工作.


Kas*_*mvd 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)]
Run Code Online (Sandbox Code Playgroud)

这种方法也适用于不同的数字:

>>> 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)]
>>> 
Run Code Online (Sandbox Code Playgroud)