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

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