将元组字典转换为有效字典时出现问题?
Problems while converting a tuple-dict to a valid dict?
给出下面的代码片段
tupled-dict:{
('apples', 'no'): 1,
('apples', 'yes'): 1,
('grapes', 'no'): 5,
('grapes', 'yes'): 6,
('cherry', 'no'): 2,
('cherry', 'yes'): 2,
('orange', 'yes'): 3,
("mango's of india", 'no'): 1,
("mango's of india", 'yes'): 1,
('chocolate', 'no'): 2,
('chocolate', 'yes'): 2,
('tomatoes', 'no'): 2,
('tomatoes', 'yes'): 3,
('pineapple', 'no'): 4,
('pineapple', 'yes'): 2,
('peas', 'no'): 3}
如何创建像这样的较短版本:
{'apples': {'availability': {'yes': 1, 'no': 1}},
'grapes': {'availability': {'yes': 6, 'no': 5}},
'cherry': {'availability': {'yes': 2, 'no': 2}},
'orange': {'availability': {'yes': 3, 'no': 0}},
"mango's of india": {'availability': {'yes': 1, 'no': 1}},
'chocolate': {'availability': {'yes': 2, 'no': 2}},
'tomatoes': {'availability': {'yes': 2, 'no': 3}},
'pineapple': {'availability': {'yes': 4, 'no': 2}},
'peas': {'availability': {'yes': 3, 'no': 0}}}
我尝试遍历元组,并提取每个水果和可用性来创建和嵌套字典,如下所示:
l=[]
helper_dict = {}
for e in a_dict.keys():
l.append(e)
fruits = list(set([i[0] for i in l]))
for e in fruits:
try:
helper_dict[e]['Yes']= a_dict[str(e),'Yes']
except KeyError:
helper_dict[e]['Yes']= 0
但是,我发现在缺少一个可用性时创建此结构很复杂。例如,('peas', 'no'): 3
只有 3:no,因为没有 ('peas', 'yes')
,我假设并将字典更新为 ('peas', 'no'): 0
。 orange
也一样,因为只有 3:yes
和 0:no
。知道如何让这个不那么复杂吗?
你只需要在新的 availability
dict 丢失时将其放入:
a_dict = {('apples', 'no'): 1,
('apples', 'yes'): 1,
('grapes', 'no'): 5,
('grapes', 'yes'): 6,
('cherry', 'no'): 2,
('cherry', 'yes'): 2,
('orange', 'yes'): 3,
("mango's of india", 'no'): 1,
("mango's of india", 'yes'): 1,
('chocolate', 'no'): 2,
('chocolate', 'yes'): 2,
('tomatoes', 'no'): 2,
('tomatoes', 'yes'): 3,
('pineapple', 'no'): 4,
('pineapple', 'yes'): 2,
('peas', 'no'): 3}
out_dict = {}
for k,v in a_dict.items():
fruit,yn = k
if fruit not in out_dict:
out_dict[fruit] = {'availability': {}}
out_dict[fruit]['availability'][yn] = v
print(out_dict)
按要求输出
行 fruit,yn = k
正在从 a_dict
中的键中提取单个项目。例如,上面代码中的第一个键是:('apples', 'no')
,这是一个元组,这是 for
循环中的 k
。这被分成 fruit,yn
以便 fruit = 'apples'
和 yn = 'no'
.
现在我们有了 fruit = 'apples'
的键,我们可以更新新字典 out_dict
。这个字典就像嵌套了 3 层深。首先你有钥匙fruit
,然后你在下面发明了钥匙'availability'
,在它下面你有钥匙:'yes' and 'no'
.
循环的倒数第二行创建较低级别的字典(如果尚未存在),但最后一行更新最内层的字典,其中 [fruit]
从顶层选择,['availability']
选择恒定的中间级别,[yn]
从 'yes'
或 'no'
键中选择。
您可以在首次创建新字典时添加默认值:
result_dict = {}
for ((fruit, cond), val) in a_dict.items():
if fruit not in result_dict:
# first insertion, so add defaults
to_insert = {}
for key in ["no", "yes"]:
to_insert[key] = 0
to_insert[cond] = val
result_dict[fruit] = {"availability": to_insert}
else:
result_dict[fruit]["availability"][cond] = val
print(result_dict)
给出下面的代码片段
tupled-dict:{
('apples', 'no'): 1,
('apples', 'yes'): 1,
('grapes', 'no'): 5,
('grapes', 'yes'): 6,
('cherry', 'no'): 2,
('cherry', 'yes'): 2,
('orange', 'yes'): 3,
("mango's of india", 'no'): 1,
("mango's of india", 'yes'): 1,
('chocolate', 'no'): 2,
('chocolate', 'yes'): 2,
('tomatoes', 'no'): 2,
('tomatoes', 'yes'): 3,
('pineapple', 'no'): 4,
('pineapple', 'yes'): 2,
('peas', 'no'): 3}
如何创建像这样的较短版本:
{'apples': {'availability': {'yes': 1, 'no': 1}},
'grapes': {'availability': {'yes': 6, 'no': 5}},
'cherry': {'availability': {'yes': 2, 'no': 2}},
'orange': {'availability': {'yes': 3, 'no': 0}},
"mango's of india": {'availability': {'yes': 1, 'no': 1}},
'chocolate': {'availability': {'yes': 2, 'no': 2}},
'tomatoes': {'availability': {'yes': 2, 'no': 3}},
'pineapple': {'availability': {'yes': 4, 'no': 2}},
'peas': {'availability': {'yes': 3, 'no': 0}}}
我尝试遍历元组,并提取每个水果和可用性来创建和嵌套字典,如下所示:
l=[]
helper_dict = {}
for e in a_dict.keys():
l.append(e)
fruits = list(set([i[0] for i in l]))
for e in fruits:
try:
helper_dict[e]['Yes']= a_dict[str(e),'Yes']
except KeyError:
helper_dict[e]['Yes']= 0
但是,我发现在缺少一个可用性时创建此结构很复杂。例如,('peas', 'no'): 3
只有 3:no,因为没有 ('peas', 'yes')
,我假设并将字典更新为 ('peas', 'no'): 0
。 orange
也一样,因为只有 3:yes
和 0:no
。知道如何让这个不那么复杂吗?
你只需要在新的 availability
dict 丢失时将其放入:
a_dict = {('apples', 'no'): 1,
('apples', 'yes'): 1,
('grapes', 'no'): 5,
('grapes', 'yes'): 6,
('cherry', 'no'): 2,
('cherry', 'yes'): 2,
('orange', 'yes'): 3,
("mango's of india", 'no'): 1,
("mango's of india", 'yes'): 1,
('chocolate', 'no'): 2,
('chocolate', 'yes'): 2,
('tomatoes', 'no'): 2,
('tomatoes', 'yes'): 3,
('pineapple', 'no'): 4,
('pineapple', 'yes'): 2,
('peas', 'no'): 3}
out_dict = {}
for k,v in a_dict.items():
fruit,yn = k
if fruit not in out_dict:
out_dict[fruit] = {'availability': {}}
out_dict[fruit]['availability'][yn] = v
print(out_dict)
按要求输出
行 fruit,yn = k
正在从 a_dict
中的键中提取单个项目。例如,上面代码中的第一个键是:('apples', 'no')
,这是一个元组,这是 for
循环中的 k
。这被分成 fruit,yn
以便 fruit = 'apples'
和 yn = 'no'
.
现在我们有了 fruit = 'apples'
的键,我们可以更新新字典 out_dict
。这个字典就像嵌套了 3 层深。首先你有钥匙fruit
,然后你在下面发明了钥匙'availability'
,在它下面你有钥匙:'yes' and 'no'
.
循环的倒数第二行创建较低级别的字典(如果尚未存在),但最后一行更新最内层的字典,其中 [fruit]
从顶层选择,['availability']
选择恒定的中间级别,[yn]
从 'yes'
或 'no'
键中选择。
您可以在首次创建新字典时添加默认值:
result_dict = {}
for ((fruit, cond), val) in a_dict.items():
if fruit not in result_dict:
# first insertion, so add defaults
to_insert = {}
for key in ["no", "yes"]:
to_insert[key] = 0
to_insert[cond] = val
result_dict[fruit] = {"availability": to_insert}
else:
result_dict[fruit]["availability"][cond] = val
print(result_dict)