为了求和,我创建了一个元组列表,其中列表中的多个项具有相同的第一个变量。 例如:
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”的所有项目,我希望能够添加其他值。
如何对此进行切片/索引以循环并执行求和?
答案 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]}
..
我希望它可以帮到你!