python - 如何在更改python中的值时合并一个嵌套字典和一个简单字典?
Posted
技术标签:
【中文标题】python - 如何在更改python中的值时合并一个嵌套字典和一个简单字典?【英文标题】:How do I merge one nested dictionary and one simple dictionary while changing the value in python? 【发布时间】:2018-05-25 07:45:18 【问题描述】:我有两本这样的字典:
dict1 = 'foo': 3.0, 'bar': 2.69, 'baz': 3.0
dict2 = 'foo': '11-abc1': 0.47, 'bar': '11-abc1': 0.30, '12-abc1': 0.0, 'baz': '14-abc1': 0.47
现在我想在乘以值的同时合并这两个字典。输出应如下所示:
dict3 = 'foo': '11-abc1': 3.0 * 0.47, 'bar': '11-abc1':
2.69 * 0.30, '12-abc1': 2.69 * 0.0, 'baz': '14-abc1': 3.0 * 0.47
最有效的方法是什么?
【问题讨论】:
迭代dict1
中的项目,每次迭代dict2
的相关子字典中的键,每个键取值并将其与dict1
中的值相乘
【参考方案1】:
你可以试试这个:
dict1 = 'foo': 3.0, 'bar': 2.69, 'baz': 3.0
dict2 = 'foo': '11-abc1': 0.47, 'bar': '11-abc1': 0.30, '12-abc1': 0.0, 'baz': '14-abc1': 0.47
new_dict = a:c:d*dict1[a] for c, d in b.items() for a, b in dict2.items()
输出:
'bar': '12-abc1': 0.0, '11-abc1': 0.8069999999999999, 'foo': '11-abc1': 1.41, 'baz': '14-abc1': 1.41
使用字符串格式展示代码的工作原理:
dict1 = 'foo': 3.0, 'bar': 2.69, 'baz': 3.0
dict2 = 'foo': '11-abc1': 0.47, 'bar': '11-abc1': 0.30, '12-abc1': 0.0, 'baz': '14-abc1': 0.47
new_dict = a:c:"*".format(d, dict1[a]) for c, d in b.items() for a, b in dict2.items()
输出:
'bar': '12-abc1': '0.0*2.69', '11-abc1': '0.3*2.69', 'foo': '11-abc1': '0.47*3.0', 'baz': '14-abc1': '0.47*3.0'
编辑:对最终值求和:
import itertools
s = 'bar': '12-abc1': 0.0, '11-abc1': 0.8069999999999999, 'foo': '11-abc1': 1.41, 'baz': '14-abc1': 1.41
new_s = list(itertools.chain(*[b.items() for a, b in s.items()]))
final_data = a:sum(i[-1] for i in b) for a, b in itertools.groupby(sorted(new_s, key=lambda x:x[0]), key=lambda x:x[0])
输出:
'12-abc1': 0.0, '11-abc1': 2.2169999999999996, '14-abc1': 1.41
【讨论】:
如果我想合并 n 嵌套字典并将这些值相加:'12-abc1': 0.0, '11-abc1': 0.8069999999999999+1.41, '14- abc1': 1.41,你有什么好的方法吗?谢谢!以上是关于python - 如何在更改python中的值时合并一个嵌套字典和一个简单字典?的主要内容,如果未能解决你的问题,请参考以下文章
Knockout JS,如何在更改可观察数组中的值时更改样式属性
TypeError:在Python中过滤JSON中的值时,字符串索引必须为整数
更改 redux 对象的值时,FlatList 项中的 TextInput 变得不集中