在元组元组中总结相似的元素

时间:2016-05-23 17:41:59

标签: python python-2.7 tuples

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})})

我不太确定如何将其重建为元组元组。无论如何,虽然每个元组中三个元素的顺序是一致的,但我对元组的索引感到不舒服。这可以在不转换为其他数据类型的情况下完成吗?

2 个答案:

答案 0 :(得分:2)

您只需要一个defaultdict(int)

>>> from collections import defaultdict
>>>
>>> d = defaultdict(int)
>>> T = (('a', 'b', 2),
...  ('a', 'c', 4),
...  ('b', 'c', 1),
...  ('a', 'b', 8),) 
>>>
>>> for key1, key2, value in T:
...     d[(key1, key2)] += value
... 
>>> [(key1, key2, value) for (key1, key2), value in d.items()]
[
    ('b', 'c', 1), 
    ('a', 'b', 10), 
    ('a', 'c', 4)
]

答案 1 :(得分:2)

代码 -

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()])