Python 2.x:对元组列表中的项进行求和

时间:2015-12-10 08:01:40

标签: list python-2.7 indexing tuples slice

为了求和,我创建了一个元组列表,其中列表中的多个项具有相同的第一个变量。 例如:

var arr = this.state.arr.slice(); // Create a copy of the array
arr.push(2); // do whatever you want to do
this.setState({ arr: arr }); // pass changes to React

我想在元组中添加第二项的各个值(即1 + 2 + 4,2 + 3 + 5,3 + 4 + 6),以获得具有相同第一项的所有值(即'm32 “)。

换句话说,对于标有“m32”的所有项目,我希望能够添加其他值。

如何对此进行切片/索引以循环并执行求和?

2 个答案:

答案 0 :(得分:1)

一些棘手的zip魔法,以及itertools.groupby将匹配的第一项组合在一起:

>>> x = [('m32',[1,2,3]),('m32',[2,3,4]),('m32',[4,5,6]),('m33',[1,2,3]),('m33',[2,3,4]),('m33',[4,5,6]),('m34',[1,2,3]),('m34',[2,3,4]),('m34',[4,5,6])]
>>> from itertools import groupby
>>> from operator import itemgetter
>>> for k,g in groupby(x,key=itemgetter(0)):
...  print (k,[sum(i) for i in zip(*zip(*g)[1])])
...
('m32', [7, 10, 13])
('m33', [7, 10, 13])
('m34', [7, 10, 13])

细分工作原理:

g是具有匹配键的项目组。 zip(*g)转换矩阵,将键和值组合在一起:

>>> for k,g in groupby(x,key=itemgetter(0)):
...  print zip(*g)
...
[('m32', 'm32', 'm32'), ([1, 2, 3], [2, 3, 4], [4, 5, 6])]
[('m33', 'm33', 'm33'), ([1, 2, 3], [2, 3, 4], [4, 5, 6])]
[('m34', 'm34', 'm34'), ([1, 2, 3], [2, 3, 4], [4, 5, 6])]

获得第二项:

>>> for k,g in groupby(x,key=itemgetter(0)):
...  print zip(*g)[1]
...
([1, 2, 3], [2, 3, 4], [4, 5, 6])
([1, 2, 3], [2, 3, 4], [4, 5, 6])
([1, 2, 3], [2, 3, 4], [4, 5, 6])

再次转置以匹配项目总和:

>>> for k,g in groupby(x,key=itemgetter(0)):
...  print zip(*zip(*g)[1])
...
[(1, 2, 4), (2, 3, 5), (3, 4, 6)]
[(1, 2, 4), (2, 3, 5), (3, 4, 6)]
[(1, 2, 4), (2, 3, 5), (3, 4, 6)]

将它们加起来:

>>> for k,g in groupby(x,key=itemgetter(0)):
...  print [sum(i) for i in zip(*zip(*g)[1])]
...
[7, 10, 13]
[7, 10, 13]
[7, 10, 13]

答案 1 :(得分:0)

马克给出的答案很棒,而且可能比我发布给你的人更有效率。但是我仍然想发布我的答案,因为你可能是python的新手,你很容易理解它。

对于这种脚本,你只需要一些想象力和基本的python概念:

dictionary={}
for name, numbers in x:
    if name in dictionary:
        current_list=dictionary[name]

        for i in range(3):
            current_list[i]+=numbers[i]

    else:
        dictionary[name]=numbers

print(dictionary)

请注意,输出是字典: {'m32': [7, 10, 13], 'm33': [7, 10, 13]} ..

我希望它可以帮到你!