将元组字典转换为有效字典时出现问题?



给定下面的代码片段

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'): 0orange也一样,因为只有3:yes0: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)

最新更新