python - Python,展平丑陋的嵌套 for 循环
问题描述
我想通过两个模块放置几个数据文件来处理它们,使用每个模块的几个参数的几个设置的每个组合。最明显的方法是使用嵌套的 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']}
出去:
[['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)
解决方案
字典足够小,最简单的方法是将七个参数硬编码为itertools.product
:一个“独立”列表、四个来自 的列表CC
和两个来自 的列表Noise
。
from itertools import product
result = list(product(
video,
CC['size'],
CC['font'],
CC['color'],
CC['language'],
Noise['CRT'],
Noise['sound']
))
您可以使用 将其简化一点operator.itemgetter
,这样就消除了对两个词典的重复提及。
from operator import itemgetter
result = list(product(
video,
*itemgetter('size', 'font', 'color', 'language')(CC),
*itemgetter('CRT', 'sound')(Noise)
))
如果您确定字典值的生成顺序,您可以进一步缩短它:
result = list(product(video, *CC.values(), *Noise.values()))
推荐阅读
- go - 如何从头订阅
- r - GLMMadaptive 用于半连续数据
- dialogflow-es - 如何将响应中的数据保存到外部 API
- javascript - 等到所有回调都被调用
- python - 如何遍历参数以计算除数
- git - 我如何从 github 历史中删除一个分支?
- regex - 正则表达式“或”似乎没有按预期运行
- python-3.x - 在numpy数组中使用等价运算符是什么意思
- python - 使用 UTF-8 字符串写入文件期间的 Python 编解码器错误
- r - Extract class of each field in data.frame; summarize classes in new data.frame