如果我有一个维度元组,比如 dims=(2, 3, 4) 并且我想为这个数组生成一个所有可能索引的列表,我发现的一个很好的解决方案是:
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]']
这一切都很好,但我正在寻找一种很好的紧凑方式来生成字符串变量,其中 dims 是任意长度的。我试图根据暗淡的长度避免一堆“if-else”子句。有任何想法吗?
最佳答案
使用 product
中的 itertools
:
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]
关于任意数量变量的python嵌套列表理解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41989482/