考虑一个嵌套字典:

d1 = {'key': {'r1': [1,2,3],
              'r2': [5,6]} }


我想从上述字典中提取字典列表,该字典将嵌套字典列表项的所有组合都使用。例如,对于上面的字典,我想要这样做:

ans = [ {'root': 'key', 'r1': 1, 'r2':5},
        {'root': 'key', 'r1': 1, 'r2':6},
        {'root': 'key', 'r1': 2, 'r2':5},
        {'root': 'key', 'r1': 2, 'r2':6},
        {'root': 'key', 'r1': 3, 'r2':5},
        {'root': 'key', 'r1': 3, 'r2':6}
      ]


对于上面的示例,我可以手动执行此操作,但是问题是d1中除“ root”以外的键数可以是任何变量,并且我的答案会发生变化,例如,考虑:

d2 = {'key': {'r1': [1,2,3],
              'r2': [5,6],
              'r3': [7,8]}
     }


现在答案看起来像:

ans = [ {'root': 'key', 'r1': 1, 'r2':5, 'r3':7},
        {'root': 'key', 'r1': 1, 'r2':6, 'r3':8},
        {'root': 'key', 'r1': 2, 'r2':5, 'r3':7},
        {'root': 'key', 'r1': 2, 'r2':6 ,'r3':8},
        .
        .(total 12 combinations)
      ]


我可以使用itertools.product在可变数量的列表中查找项目组合,如下所示:

from itertools import product
list(product(d1['key']['r1'], d1['key']['r2']))


返回:

[(1, 5), (1, 6), (2, 5), (2, 6), (3, 5), (3, 6)]


但是,如何为每个项目添加相应的密钥,以及如何动态地执行呢?

最佳答案

只要“根”保持不变,就可以将每个产品与itertools.productzip一起使用字典键:

>>> from itertools import product
>>> combinations = product(*d2['key'].values())
>>> [{'root': 'key', **dict(zip(d2['key'].keys(), c))} for c in combinations]




[{'r1': 1, 'r2': 5, 'r3': 7, 'root': 'key'},
 {'r1': 1, 'r2': 5, 'r3': 8, 'root': 'key'},
 {'r1': 1, 'r2': 6, 'r3': 7, 'root': 'key'},
 {'r1': 1, 'r2': 6, 'r3': 8, 'root': 'key'},
 ...


值得庆幸的是,dict.keys()dict.values()以相应的顺序返回键和值,无论您的python版本如何,这都是规范所保证的。

关于python - 如何从嵌套字典中查找列表的组合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52799742/

10-14 18:12
查看更多