给定一个字典,获取所有可能的子字典配置
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))
我遇到了以下困难: 鉴于我的输入字典有 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))