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

3

我有以下列表:

indices = [125,144,192]

我希望生成这样的结构,我想使用这三个数字的任意组合作为3D列表的索引:
myList[i][j][k] = someVar

其中ijk循环遍历下面显示的所有组合:

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 

这个问题有什么符合Python风格的解决方案呢?

已经很好了,你认为还能简化些什么? - Lorenzo Gatti
我只是想知道在Python中是否已经有一种方法来做到这一点,而且我可能需要在我的代码中重复几次,也适用于更大的列表:[1,2,3,...,124] - sodiumnitrate
2个回答

4
你可以使用 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)]

作为一种更通用的解决方案,您可以使用izip(在Python 3中,zip是有效的)和repeat创建所需的配对,然后将它们传递给product

>>> 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 element in indexList: i,j,k = element 然后 myList[i][j][k],或者有没有一种方法可以使用元组直接访问列表中的元素? - sodiumnitrate
1
@sodiumnitrate 你可以使用多重解包,查看编辑! - Mazdak

1
似乎更加模糊不清,但是...
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接