如何从一组列表中获取笛卡尔积(每种可能的值组合)?
输入:
somelists = [
[1, 2, 3],
['a', 'b'],
[4, 5]
]
Run Code Online (Sandbox Code Playgroud)
期望的输出:
[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4), (2, 'a', 5) ...]
Run Code Online (Sandbox Code Playgroud) 我在Python中有一个3D数组,我需要迭代数组中的所有多维数据集.也就是说,对于(x,y,z)阵列维度中的所有维度,我需要访问多维数据集:
array[(x + 0, y + 0, z + 0)]
array[(x + 1, y + 0, z + 0)]
array[(x + 0, y + 1, z + 0)]
array[(x + 1, y + 1, z + 0)]
array[(x + 0, y + 0, z + 1)]
array[(x + 1, y + 0, z + 1)]
array[(x + 0, y + 1, z + 1)]
array[(x + 1, y + 1, z + 1)]
Run Code Online (Sandbox Code Playgroud)
该数组是一个Numpy数组,虽然这不是必需的.我刚刚发现使用单线程读取数据非常容易numpy.fromfile().
是否有更多的Pythonic方法来迭代这些而不是以下?这简直就像使用Python语法的C一样.
for …Run Code Online (Sandbox Code Playgroud) 我想将多个数据文件通过两个模块来处理它们,使用每个模块的多个参数上的多个设置的每种组合。最明显的方法是使用嵌套的 for 循环,但是当您达到 7 个以上的嵌套 for 循环时,就不行了。我想让这个比那个更优雅。
我已经读过几个非常相似的问题,但是虽然这个问题表明我可能想使用 itertools,但它只迭代数字序列,而我想迭代作为字典中的值包含的字符串列表;另一个揭示了我想要的叫做笛卡尔积,但不是如何从字典值中得到它;虽然这个组合了笛卡尔积中的列表字典,但我希望输出是如上一个链接问题中的列表列表,而不是字典列表。
在:
video = ["It's Friday.mp4",'Hot Koolaid.mov','The Water Buffalo Song.mp4']
CC = {'size':['6','10','14'],'font':['Courier New'],'color':['black','white'],'language':['English']}
Noise = {'CRT':['speckles','rising stripes','no signal'],'sound':['white','crackle']}
Run Code Online (Sandbox Code Playgroud)
出去:
[['It's Friday.mp4','6','Courier New','black','English','speckles','white'],
['Hot Koolaid.mov','6','Courier New','black','English','speckles','white']
...
['The Water Buffalo Song.mp4','14','Courier New','white','English','no signal','crackle']]
Run Code Online (Sandbox Code Playgroud)
我很确定我想使用itertools,并且我想要制作的是列表的笛卡尔积。我认为目前最困难的事情是从字典中提取这些列表并将其元素的组合放入列表中。
_________编辑:____________
在检查我随后接受的答案的过程中,我发现将所有参数都放在列表中(对于我的目的而言)很重要,即使只考虑一个值;不带方括号的字符串将一次迭代一个字符。
丑陋的嵌套 for 循环如下所示:
for vid in video:
for siz in CC['size']:
for fon in CC['font']:
for col in CC['color']:
for lan in CC['language']:
for crt in Noise['CRT']:
for …Run Code Online (Sandbox Code Playgroud)