【问题标题】:How to find combinations of lists from nested dictionaries如何从嵌套字典中查找列表组合
【发布时间】:2019-03-18 21:04:52
【问题描述】:

考虑一个嵌套字典:

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)]

但是如何为这些项目中的每一个添加相应的键以及如何动态地执行此操作?

【问题讨论】:

    标签: python python-3.x list dictionary


    【解决方案1】:

    只要“根”不变,您就可以将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 版本如何,规范都保证了这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      相关资源
      最近更新 更多