2014-11-05 58 views
3

我想创建数字列表有三个值,并想覆盖从0每一个组合的名单 - 3。例如:创建组合

0, 0, 0 
0, 0, 1 
... 
1, 0, 3 
1, 1, 3 

一路3, 3, 3

有没有比使用多个for循环更好的方法吗?

这里是我使用的代码:

for i in range (0, 4): 
    for x in range (0, 4): 
     for t in range (0, 4): 
     assign = [i, x, t] 

回答

2

您可以使用itertools.product

>>> from itertools import product 
>>> list(product({0, 1, 2, 3}, repeat=3)) 
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 0), (0, 2, 1), (0, 2, 2), (0, 2, 3), (0, 3, 0), (0, 3, 1), (0, 3, 2), (0, 3, 3), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 0, 3), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 0), (1, 3, 1), (1, 3, 2), (1, 3, 3), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 0), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 0), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 0, 0), (3, 0, 1), (3, 0, 2), (3, 0, 3), (3, 1, 0), (3, 1, 1), (3, 1, 2), (3, 1, 3), (3, 2, 0), (3, 2, 1), (3, 2, 2), (3, 2, 3), (3, 3, 0), (3, 3, 1), (3, 3, 2), (3, 3, 3)] 
>>> 
2

可以使用itertools.product()功能那个:

from itertools import product 

for i, x, t in product(range(4), repeat=3): 
    print (i, x, t) 

演示:

>>> from itertools import product 
>>> for i, x, t in product(range(4), repeat=3): 
...  print (i, x, t) 
... 
(0, 0, 0) 
(0, 0, 1) 
(0, 0, 2) 
(0, 0, 3) 
(0, 1, 0) 
# ... truncated for readability ... 
(3, 2, 3) 
(3, 3, 0) 
(3, 3, 1) 
(3, 3, 2) 
(3, 3, 3) 
1

itertools.product()是一个很好的解决方案,但如果你万一要列表,而不是一个元组列表,你可以这样做:

[ [x,y,z] for x,y,z in itertools.product(range(4), repeat=3)] 

或相当的列表理解:

[ [x,y,z] for x in range(0,4) 
      for y in range(0,4) 
       for z in range(0,4)]