给定一个字典,获取所有可能的子字典配置

Given a dictionary, getting all possible sub-dictionary configurations possible

我遇到了以下困难: 鉴于我的输入字典有 4 个键及其值,例如

global_dict = {'Cloudy': (False, True),
               'Rain': False,
               'Sprinkler': (False, True),
               'WetGrass': (False, True)}

我想得到所有可能的子词典,每个键只有一个值;最好在列表中,例如

dict_list = [
    {'WetGrass': False, 'Rain': False, 'Sprinkler': False, 'Cloudy': False},
    {'WetGrass': False, 'Rain': False, 'Sprinkler': False, 'Cloudy': True},
    {'WetGrass': False, 'Rain': False, 'Sprinkler': True, 'Cloudy': False},
    {'WetGrass': False, 'Rain': False, 'Sprinkler': True, 'Cloudy': True},
    {'WetGrass': True, 'Rain': False, 'Sprinkler': False, 'Cloudy': False},
    {'WetGrass': True, 'Rain': False, 'Sprinkler': False, 'Cloudy': True},
    {'WetGrass': True, 'Rain': False, 'Sprinkler': True, 'Cloudy': False},
    {'WetGrass': True, 'Rain': False, 'Sprinkler': True, 'Cloudy': True}
]

我已经尝试了以下方法:

src = {'lblA': (False, True), 'lblB': (False, True), 'lblC': (0, 1, 2)}
labels, terms = zip(*src.items())
print [dict(zip(labels, term)) for term in itertools.product(*terms)]

从这里开始:

Best way to enumerate a cartesian product with labels in python?

但我一直收到错误消息:

TypeError 'bool' object is not iterable

希望有人能帮帮我。

谢谢!

这里的初始问题是你的所有值都是元组,除了 'Rain'(该值是 bool 并且它不可迭代),所以我也把它变成了元组:

global_dict = {'Cloudy': (False, True),
               'Rain': (False,),
               'Sprinkler': (False, True),
               'WetGrass': (False, True)}

其中 (False,) 是单元素元组。

最后我们可以创建 dict_list 使用 itertools.product 就像

from itertools import product

global_dict = {'Cloudy': (False, True),
               'Rain': (False,),
               'Sprinkler': (False, True),
               'WetGrass': (False, True)}

possible_values = product(*global_dict.values())
dict_list = [dict(zip(global_dict.keys(), values))
             for values in possible_values]

给我们

>>>dict_list
[{'Cloudy': False, 'Rain': False, 'Sprinkler': False, 'WetGrass': False},
 {'Cloudy': False, 'Rain': False, 'Sprinkler': False, 'WetGrass': True},
 {'Cloudy': False, 'Rain': False, 'Sprinkler': True, 'WetGrass': False},
 {'Cloudy': False, 'Rain': False, 'Sprinkler': True, 'WetGrass': True},
 {'Cloudy': True, 'Rain': False, 'Sprinkler': False, 'WetGrass': False},
 {'Cloudy': True, 'Rain': False, 'Sprinkler': False, 'WetGrass': True},
 {'Cloudy': True, 'Rain': False, 'Sprinkler': True, 'WetGrass': False},
 {'Cloudy': True, 'Rain': False, 'Sprinkler': True, 'WetGrass': True}]

测试

desired_dict_list = [
    {'WetGrass': False, 'Rain': False, 'Sprinkler': False, 'Cloudy': False},
    {'WetGrass': False, 'Rain': False, 'Sprinkler': False, 'Cloudy': True},
    {'WetGrass': False, 'Rain': False, 'Sprinkler': True, 'Cloudy': False},
    {'WetGrass': False, 'Rain': False, 'Sprinkler': True, 'Cloudy': True},
    {'WetGrass': True, 'Rain': False, 'Sprinkler': False, 'Cloudy': False},
    {'WetGrass': True, 'Rain': False, 'Sprinkler': False, 'Cloudy': True},
    {'WetGrass': True, 'Rain': False, 'Sprinkler': True, 'Cloudy': False},
    {'WetGrass': True, 'Rain': False, 'Sprinkler': True, 'Cloudy': True}
]

assert (len(dict_list) == len(desired_dict_list) and
        all(dictionary in dict_list
            for dictionary in desired_dict_list))