【发布时间】:2019-12-19 09:40:39
【问题描述】:
我想通过两个模块来处理多个数据文件,使用每个模块的多个参数的多个设置的每种组合。最明显的方法是使用嵌套的 for 循环,但是当你达到 7+ 个嵌套的 for 循环时,不会。我想让这个比那个更优雅。
我已经阅读了几个非常相似的问题,但是虽然this one 表明我可能想要使用 itertools,但它只遍历数字序列,而我想遍历作为值包含在字典中的字符串列表; this other one 揭示了我想要的被称为笛卡尔积,但不是如何从字典值中得到它;虽然this one 结合了笛卡尔积中的列表字典,但我希望输出是上一个链接问题中的列表列表,而不是字典列表。
在:
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']}
输出:
[['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']]
我很确定我想使用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 sou in Noise['sound']:
some_function(vid,siz,fon,col,lan,crt,sou)
【问题讨论】:
-
通过您的示例输入,您怎么知道 ['black', 'white'] 意味着您有两个“黑色”项目和一个“白色”?
-
@CMMCD 不是两黑一白的意思;省略号代表了很多很多列表。笛卡尔积也可以称为阶乘;我们正在列出所有可能的开放选项组合。
标签: python list dictionary itertools cartesian-product