总结一个元组元组和一个嵌套的字典

时间:2016-05-20 08:34:00

标签: python python-2.7 dictionary casting tuples

我有可以用两种不同形式表示的数据(由于历史原因,我不会介绍)。第一个是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))

什么是更好的方式?

2 个答案:

答案 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))