我有可以用两种不同形式表示的数据(由于历史原因,我不会介绍)。第一个是tuple
tuple
s:
t = (('a', 'x', 3),
('a', 'f', 1),
('b', 'r', 23),
('b', 'e', 3))
第二个作为dict
的{{1}}:
dict
相同的数据,不同的表示。我现在需要最终得到两者的组合(并且必须保持元组的元组形式而不是嵌套的dict形式),值求和。即。
d = {'a' : {'x': 45, 'f' : 4},
'b' : {'r' : 34, 'e' : 45}}
这似乎是一个两步过程(将嵌套的dict转换为元组的元组,然后将每个元组中的相应元组相加)。我正在努力超越第一部分,我错过了两个元组(我不喜欢我如何硬编码索引):
(('a', 'x', 48),
('a', 'f', 5),
('b', 'r', 57),
('b', 'e', 48))
什么是更好的方式?
答案 0 :(得分:1)
您可以在tuple()
中使用生成器表达式,循环遍历元组并将第三项与其在字典中的相对值相加:
>>> tuple((i, j, k + d.get(i, {}).get(j, 0)) for i, j, k in t)
(('a', 'x', 48),
('a', 'f', 5),
('b', 'r', 57),
('b', 'e', 48))
请注意,使用dict.get()
方法的优点是,如果字典中不存在该键,则返回0。
请注意,如果您拥有元组或元组元组列表没有任何区别,则可以使用列表推导而不是生成器表达式。因为列表理解在运行时方面更加优化,因为它不需要在生成器函数中调用next()
之类的额外方法来检索项目。
答案 1 :(得分:1)
如果您确定所有元组和dicts包含完全相同的元素(可以使用当前示例),则可以使用转换为元组的列表推导:
tuple([(x, y, z + d[x][y]) for x, y, z in t ])
正确地给出:
(('a', 'x', 48), ('a', 'f', 5), ('b', 'r', 57), ('b', 'e', 48))