Python:在嵌套字典中循环并组合值

时间:2018-08-04 00:41:10

标签: python loops dictionary iteration dictionary-comprehension

我正在创建一个嵌套的字典,该字典描述了几种情况(“ 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方法。谢谢!

1 个答案:

答案 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'))]