2017-02-01 9 views
3

dims =(2,3,4)のような次元のタプルがあり、この配列のすべての可能なインデックスのリストを生成したい場合は、見つかっです:任意の数の変数に対するpython入れ子リストの理解

dims = (2, 3, 4) 
indices = [range(0, d) for d in dims] 
strings = ["[%i][%i][%i]" % (i,j,k) for i in indices[0] for j in indices[1] for k in indices[2]] 
print strings: 
['[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]', '[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]'] 

これはすべてが順調と良いですが、私は任意の長さで暗くなり、文字列変数を生成するための素敵なコンパクトな方法を探しています。私はdimの長さに応じて "if-else"節の束を避けようとしています。何か案は? itertoolsから

+0

[ 'itertools.product'](https://docs.python.org/2/library/itertools.html# itertools.product)。 – BrenBarn

答えて

1

使用product:文字列を扱うためのよう

In [3]: import itertools 

In [4]: dims = (2, 3, 4) 

In [5]: for idx in itertools.product(*map(range, dims)): 
    ...:  print(idx) 
    ...: 
(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) 
(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) 

は、多くの方法があります。ここでは、迅速かつ汚い方法です:

In [6]: def block_me(n): 
    ...:  return "[" + str(n) + "]" 
    ...: 

In [7]: for idx in itertools.product(*map(range, dims)): 
    ...:  print("".join([block_me(i) for i in idx])) 
    ...: 
[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] 
[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

使用itertools.product

>>> from itertools import product 
>>> dims = (2, 3, 4, 5) 
>>> list(product(*map(range, dims))) 
[(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 0, 2), (0, 0, 0, 3), (0, 0, 0, 4), (0, 0, 1, 0), (0, 0, 1, 1), (0, 0, 1, 2), (0, 0, 1, 3), (0, 0, 1, 4), (0, 0, 2, 0), (0, 0, 2, 1), (0, 0, 2, 2), (0, 0, 2, 3), (0, 0, 2, 4), (0, 0, 3, 0), (0, 0, 3, 1), (0, 0, 3, 2), (0, 0, 3, 3), (0, 0, 3, 4), (0, 1, 0, 0), (0, 1, 0, 1), (0, 1, 0, 2), (0, 1, 0, 3), (0, 1, 0, 4), (0, 1, 1, 0), (0, 1, 1, 1), (0, 1, 1, 2), (0, 1, 1, 3), (0, 1, 1, 4), (0, 1, 2, 0), (0, 1, 2, 1), (0, 1, 2, 2), (0, 1, 2, 3), (0, 1, 2, 4), (0, 1, 3, 0), (0, 1, 3, 1), (0, 1, 3, 2), (0, 1, 3, 3), (0, 1, 3, 4), (0, 2, 0, 0), (0, 2, 0, 1), (0, 2, 0, 2), (0, 2, 0, 3), (0, 2, 0, 4), (0, 2, 1, 0), (0, 2, 1, 1), (0, 2, 1, 2), (0, 2, 1, 3), (0, 2, 1, 4), (0, 2, 2, 0), (0, 2, 2, 1), (0, 2, 2, 2), (0, 2, 2, 3), (0, 2, 2, 4), (0, 2, 3, 0), (0, 2, 3, 1), (0, 2, 3, 2), (0, 2, 3, 3), (0, 2, 3, 4), (1, 0, 0, 0), (1, 0, 0, 1), (1, 0, 0, 2), (1, 0, 0, 3), (1, 0, 0, 4), (1, 0, 1, 0), (1, 0, 1, 1), (1, 0, 1, 2), (1, 0, 1, 3), (1, 0, 1, 4), (1, 0, 2, 0), (1, 0, 2, 1), (1, 0, 2, 2), (1, 0, 2, 3), (1, 0, 2, 4), (1, 0, 3, 0), (1, 0, 3, 1), (1, 0, 3, 2), (1, 0, 3, 3), (1, 0, 3, 4), (1, 1, 0, 0), (1, 1, 0, 1), (1, 1, 0, 2), (1, 1, 0, 3), (1, 1, 0, 4), (1, 1, 1, 0), (1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 1, 3), (1, 1, 1, 4), (1, 1, 2, 0), (1, 1, 2, 1), (1, 1, 2, 2), (1, 1, 2, 3), (1, 1, 2, 4), (1, 1, 3, 0), (1, 1, 3, 1), (1, 1, 3, 2), (1, 1, 3, 3), (1, 1, 3, 4), (1, 2, 0, 0), (1, 2, 0, 1), (1, 2, 0, 2), (1, 2, 0, 3), (1, 2, 0, 4), (1, 2, 1, 0), (1, 2, 1, 1), (1, 2, 1, 2), (1, 2, 1, 3), (1, 2, 1, 4), (1, 2, 2, 0), (1, 2, 2, 1), (1, 2, 2, 2), (1, 2, 2, 3), (1, 2, 2, 4), (1, 2, 3, 0), (1, 2, 3, 1), (1, 2, 3, 2), (1, 2, 3, 3), (1, 2, 3, 4)] 
関連する問題