python-对元组中的相似元素求和

this问题开始,我现在需要对整个元组中的相似条目(元组)求和.

因此,给定一个元组,例如:

T = (('a', 'b', 2),
 ('a', 'c', 4),
 ('b', 'c', 1),
 ('a', 'b', 8),)

对于第一个和第二个元素相同的所有元组,我想对第三个元素求和,否则,将其保留在原处.因此,我将得出以下元组:

(('a', 'b', 10),
 ('a', 'c', 4),
 ('b', 'c', 1),)

封闭的元组中元组的顺序(和求和)无关紧要.

我们正在处理元组,因此我们无法利用dict.get()之类的东西.如果我们走defaultdict路线:

In [1218]: d = defaultdict(lambda: defaultdict(int))

In [1220]: for t in T:
    d[t[0]][t[1]] += t[2]
   ......:     

In [1225]: d
Out[1225]: 
defaultdict(<function __main__.<lambda>>,
            {'a': defaultdict(int, {'b': 10, 'c': 4}),
             'b': defaultdict(int, {'c': 1})})

我不太确定如何将其重构为元组.无论如何,尽管每个元组中三个元素的顺序是一致的,但是我对元组的索引并不满意.无需转换为其他数据类型就可以做到吗?

解决方法:

代码-

from collections import defaultdict

T1 = (('a', 'b', 2),
 ('a', 'c', 4),
 ('b', 'c', 1),
 ('a', 'b', 8),)

d = defaultdict(int)

for x, y, z in T1:
    d[(x, y)] += z

T2 = tuple([(*k, v) for k, v in d.items()])

print(T2)

输出-

(('a', 'c', 4), ('b', 'c', 1), ('a', 'b', 10))

如果您有兴趣维护原始订单,请-

from collections import OrderedDict

T1 = (('a', 'b', 2), ('a', 'c', 4), ('b', 'c', 1), ('a', 'b', 8),)

d = OrderedDict()

for x, y, z in T1:
    d[(x, y)] = d[(x, y)] + z if (x, y) in d else z

T2 = tuple((*k, v) for k, v in d.items())

print(T2)

输出-

(('a', 'b', 10), ('a', 'c', 4), ('b', 'c', 1))

在Python 2中,您应该使用-

T2 = tuple([(x, y, z) for (x, y), z in d.items()])
上一篇:python – 获取自己的元组元素的数量……不仅仅是范围或序列


下一篇:python – 为同一个字典值创建可交换元组键的最佳方法是什么?