[英]Python: Looping over and combining values in nested dictionaries
我正在创建一个嵌套的字典,该字典描述了几种情况(“ 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方法。 谢谢!
首先,转换数据以删除我们不需要的部分:
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'))]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.