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

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

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

最佳答案

代码-

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 - 对元组中的相似元素求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37397296/

相关文章:

python - 如何从左到右解包元组?

python - Google BigQuery Schema 冲突(pyarrow 错误)与使用 load_table_from_dataframe 的数字数据类型

python - 凯撒密码中单个字符不匹配 : Python

python - Pandas 到 Excel : Keep Existing Data

python - 以元组为值对字典进行排序

python - 将列表转换为元组也转换列表中的列表

python - 使用 Python .pth 文件假设无权访问 site-packages 目录

python - 父类(super class)中的调用方法没有给出我期望的输出?

python - 将额外的字段添加到现有的 namedtuple 对象并解封

python - 将两个脚本合并为一个新脚本(将列附加到 csv)