划分不同字典结构的2个字典
Dividing 2 dictionary of different dictionary structure
我想划分 2 个不同结构的字典,我找到了我想要的结果,但我觉得我的代码对于这个问题来说太长了。有没有更聪明的选择?
我的字典只有d2
d2 = {3: {'good best third': 1, 'mind third': 0, 'bad third': 0}, 2: {'good so second': 0, 'mind second': 1, 'bad second': 2}, 1: {'good': 2, 'mind': 0, 'bad': 1}}
然后想除以响应父键的所有值的总和。为了简单的解释,我把它写成如下:
d1 = {3: 1, 2: 3, 1: 3}
目标是计算d3,其中
dict3 = d2 / d1
我的代码
import copy
temp = []
all_vote_len_dict = {3: {'good best third': 1, 'mind third': 0, 'bad third': 0}, 2: {'good so second': 0, 'mind second': 1, 'bad second': 2}, 1: {'good': 2, 'mind': 0, 'bad': 1}}
d1 = copy.deepcopy(all_vote_len_dict)
d2 = copy.deepcopy(all_vote_len_dict)
# to know total number of vote received per unique post
for key, values in d1.items():
temp.append(sum(values.values()))
temp.append(sum(values.values()))
temp.append(sum(values.values()))
counter=0
for keys, values in d1.items():
for key, value in values.items():
values[key]=temp[counter]
counter +=1
dict3={}
for (k,dict1), (k2,dict2) in zip(d1.items(), d2.items()):
dict3[k]=({k: (dict2[k] / dict1[k]) for k in dict1})
dict3
dict3 的结果
{3: {'good best third': 1.0, 'mind third': 0.0, 'bad third': 0.0},
2: {'good so second': 0.0,
'mind second': 0.3333333333333333,
'bad second': 0.6666666666666666},
1: {'good': 0.6666666666666666, 'mind': 0.0, 'bad': 0.3333333333333333}}
有没有更聪明的选择?
下面的代码可以实现“技巧”
d2 = {3: {'good best third': 1, 'mind third': 0, 'bad third': 0},
2: {'good so second': 0, 'mind second': 1, 'bad second': 2}, 1: {'good': 2, 'mind': 0, 'bad': 1}}
d1 = {k: sum(vv for vv in v.values()) for k, v in d2.items()}
# d1 is {3: 1, 2: 3, 1: 3}
d3 = {k: {kk: vv / d1[k] for kk, vv in v.items()} for k, v in d2.items()}
for k, v in d3.items():
print(f'{k} -> {v}')
输出
3 -> {'good best third': 1.0, 'mind third': 0.0, 'bad third': 0.0}
2 -> {'good so second': 0.0, 'mind second': 0.3333333333333333, 'bad second': 0.6666666666666666}
1 -> {'good': 0.6666666666666666, 'mind': 0.0, 'bad': 0.3333333333333333}
我想划分 2 个不同结构的字典,我找到了我想要的结果,但我觉得我的代码对于这个问题来说太长了。有没有更聪明的选择?
我的字典只有d2
d2 = {3: {'good best third': 1, 'mind third': 0, 'bad third': 0}, 2: {'good so second': 0, 'mind second': 1, 'bad second': 2}, 1: {'good': 2, 'mind': 0, 'bad': 1}}
然后想除以响应父键的所有值的总和。为了简单的解释,我把它写成如下:
d1 = {3: 1, 2: 3, 1: 3}
目标是计算d3,其中
dict3 = d2 / d1
我的代码
import copy
temp = []
all_vote_len_dict = {3: {'good best third': 1, 'mind third': 0, 'bad third': 0}, 2: {'good so second': 0, 'mind second': 1, 'bad second': 2}, 1: {'good': 2, 'mind': 0, 'bad': 1}}
d1 = copy.deepcopy(all_vote_len_dict)
d2 = copy.deepcopy(all_vote_len_dict)
# to know total number of vote received per unique post
for key, values in d1.items():
temp.append(sum(values.values()))
temp.append(sum(values.values()))
temp.append(sum(values.values()))
counter=0
for keys, values in d1.items():
for key, value in values.items():
values[key]=temp[counter]
counter +=1
dict3={}
for (k,dict1), (k2,dict2) in zip(d1.items(), d2.items()):
dict3[k]=({k: (dict2[k] / dict1[k]) for k in dict1})
dict3
dict3 的结果
{3: {'good best third': 1.0, 'mind third': 0.0, 'bad third': 0.0},
2: {'good so second': 0.0,
'mind second': 0.3333333333333333,
'bad second': 0.6666666666666666},
1: {'good': 0.6666666666666666, 'mind': 0.0, 'bad': 0.3333333333333333}}
有没有更聪明的选择?
下面的代码可以实现“技巧”
d2 = {3: {'good best third': 1, 'mind third': 0, 'bad third': 0},
2: {'good so second': 0, 'mind second': 1, 'bad second': 2}, 1: {'good': 2, 'mind': 0, 'bad': 1}}
d1 = {k: sum(vv for vv in v.values()) for k, v in d2.items()}
# d1 is {3: 1, 2: 3, 1: 3}
d3 = {k: {kk: vv / d1[k] for kk, vv in v.items()} for k, v in d2.items()}
for k, v in d3.items():
print(f'{k} -> {v}')
输出
3 -> {'good best third': 1.0, 'mind third': 0.0, 'bad third': 0.0}
2 -> {'good so second': 0.0, 'mind second': 0.3333333333333333, 'bad second': 0.6666666666666666}
1 -> {'good': 0.6666666666666666, 'mind': 0.0, 'bad': 0.3333333333333333}