我正在创建一个嵌套的字典,该字典描述了几种情况(“ 1ql”和“ 2ql”),每种情况都有不同的变体数量(“ var0”,“ var1”,...)。我通过以下方式使用dict理解:
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
但是,我想针对任何情况自动获取此信息,针对每种情况进行任何数量的变化,而无需手动指定。我尝试了不同的迭代方案,甚至通过反转内部和外部键,但都无济于事。
我真的很想学习实现这一点的最pythonic方法。谢谢!
答案 0 :(得分:0)
首先,转换数据以删除我们不需要的部分:
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'))]