迭代列表元素的所有可能组合,并在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您可以使用多重解包,请检查编辑!