给定下面的代码片段
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
字典时放入它:
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)