我正在创建一个嵌套的字典,它描述了几种情况('1ql‘和'2ql'),每种情况都有不同数量的变体('var0','var1',...)。我使用字典理解的方式如下:
from numpy import random as rnd
QLS = {
key: {
idx: rad
for idx, rad in enumerate(['var{}'.format(i) for i in range(rnd.randint(1, 4))])
}
for key in ['1ql', '2ql']
}
这很有效,但我一直在为如何处理保存到文件的字典而苦苦挣扎。我想迭代“1ql”的每个变体,然后同时迭代“2ql”的每个迭代。这很容易实现,如下所示:
for key1, val1 in QLS['1ql'].items():
for key2, val2 in QLS['2ql'].items():
print('1ql: {}, 2ql: {}'.format(val1, val2))
对于'1ql‘的2个变体和'2ql’的3个变体,总共产生6个排列:
1ql: var0, 2ql: var0
1ql: var0, 2ql: var1
1ql: var0, 2ql: var2
1ql: var1, 2ql: var0
1ql: var1, 2ql: var1
1ql: var1, 2ql: var2
但是,我希望自动为任何数量的情况,为每个案例的任何数量的变化,而不需要手动指定这些。我尝试了不同的迭代方案,甚至颠倒了内键和外键,但都无济于事。
我真的很想学一种最简单的方法来完成这个任务。谢谢!
发布于 2018-08-04 01:07:23
首先,转换数据以删除我们不需要的部分:
x = [[(case, var) for var in QLS[case].values()] for case in QLS.keys()]
现在,x
类似于:
[[('1ql', 'var0'), ('1ql', 'var1'), ('1ql', 'var2')],
[('2ql', 'var0'), ('2ql', 'var1'), ('2ql', 'var2')]]
最后,使用itertools.product()
得到结果:
list(itertools.product(*x))
在您的实际代码中,您可能会迭代结果,并对每个结果使用print()
以获得所需的格式,但是使用上面的list()
包装会让您有所了解:
[(('1ql', 'var0'), ('2ql', 'var0')),
(('1ql', 'var0'), ('2ql', 'var1')),
(('1ql', 'var0'), ('2ql', 'var2')),
(('1ql', 'var1'), ('2ql', 'var0')),
(('1ql', 'var1'), ('2ql', 'var1')),
(('1ql', 'var1'), ('2ql', 'var2')),
(('1ql', 'var2'), ('2ql', 'var0')),
(('1ql', 'var2'), ('2ql', 'var1')),
(('1ql', 'var2'), ('2ql', 'var2'))]
https://stackoverflow.com/questions/51681527
复制