迭代列表元素的所有可能组合,并在Python中用作索引

迭代列表元素的所有可能组合,并在Python中用作索引,python,Python,我有以下清单: indices = [125,144,192] 我想要生成这样一种结构,我想要使用其中三个数字的任意组合作为3d列表的索引: myList[i][j][k] = someVar 其中,i、j和k在下面显示的所有组合上循环: i,j,k = 0,0,0 i,j,k = 0,0,192 i,j,k = 0,144,0 i,j,k = 125,0,0 i,j,k = 0,144,192 i,j,k = 125,0,192 i,j,k = 125,144,0 i,j,k = 125,

我有以下清单:

indices = [125,144,192]
我想要生成这样一种结构,我想要使用其中三个数字的任意组合作为3d列表的索引:

myList[i][j][k] = someVar
其中,
i
j
k
在下面显示的所有组合上循环:

i,j,k = 0,0,0
i,j,k = 0,0,192
i,j,k = 0,144,0
i,j,k = 125,0,0
i,j,k = 0,144,192
i,j,k = 125,0,192
i,j,k = 125,144,0
i,j,k = 125,144,192
换句话说,我想简化以下内容:

for i in [0,125]:
    for j in  [0,144]:
        for k in [0,192]:
            myList[i][j][k] = someVar 

什么样的pythonic方法可以做到这一点?

您可以使用
itertools.product

>>> list(product([0,125],[0,144],[0,192]))
[(0, 0, 0), 
 (0, 0, 192), 
 (0, 144, 0), 
 (0, 144, 192), 
 (125, 0, 0), 
 (125, 0, 192), 
 (125, 144, 0), 
 (125, 144, 192)]
>>> indices = [125,144,192]
>>> from itertools import product,izip,repeat
>>> list(product(*izip(repeat(0,len(indices)),indices)))
[(0, 0, 0), (0, 0, 192), (0, 144, 0), (0, 144, 192), (125, 0, 0), (125, 0, 192), (125, 144, 0), (125, 144, 192)]
>>> 
或者,作为一个更通用的解决方案,您可以使用
izip
(在python 3中
zip
是有效的)和
repeat
来创建所需的对,然后将它们传递给
product

>>> list(product([0,125],[0,144],[0,192]))
[(0, 0, 0), 
 (0, 0, 192), 
 (0, 144, 0), 
 (0, 144, 192), 
 (125, 0, 0), 
 (125, 0, 192), 
 (125, 144, 0), 
 (125, 144, 192)]
>>> indices = [125,144,192]
>>> from itertools import product,izip,repeat
>>> list(product(*izip(repeat(0,len(indices)),indices)))
[(0, 0, 0), (0, 0, 192), (0, 144, 0), (0, 144, 192), (125, 0, 0), (125, 0, 192), (125, 144, 0), (125, 144, 192)]
>>> 
对于索引,您可以执行以下操作:

for i,j,k in product(*izip(repeat(0,len(indices)),indices)):
    # do stuff with myList[i][j][k]

看起来更模棱两可,但

for triple in [(x,y,z) for x in [0,125] for y in [0,144] for z in [0,192]]:
    myList[ triple[0] ][ triple[1] ][ triple[2] ] = somevar

它已经很好了,你认为你可以简化什么?我只是想知道在Python中是否已经有一种方法可以做到这一点,而且我可能需要在我的代码中重复几次,对于更大的列表:
[1,2,3,…,124]
。然后对indexList中的元素执行以下操作是否有意义:
:I,j,k=element
然后
myList[i][j][k]
,或者有没有办法使用元组直接访问列表中的元素?@sodiumnitrate您可以使用多重解包,请检查编辑!