从给定键的列表列表中添加值

Add values from a list of lists given a key

在下面的列表列表中,我希望提取按每个子列表的第一个元素分组的列表列表。在每个组中,我想将剩余元素的各自值相加。

ex = [['1', -104.08,  -1],
      ['1',  629.58,   5],
      ['1', 1032.51,   4],
      ['1', -308.18,  -9],
      ['3', -987.18,  34],
      ['3',-1153.71, -21],
      ['3',  -88.08,  75],
      ['3', -139.34, -85],
      ['6',   141.7,  90],
      ['6',   14.77,   4],
      ['6',    74.6,  -5]]

结果应该是这样的:

list_result = [['1',  1249.83,   -1],
               ['3', -2368.31,    3],
               ['6',   231.07,   89]]

我试过list (set ())这样的方法来设置key,然后我手动求和,但我相信还有更有效的方法,更少的行数。

因为这个问题对我来说,我会做一个字典来获得相同的值并将其更改为列表

ex = [['1', -104.08,   -1],
       ['1',  629.58,   5],
       ['1', 1032.51,   4],
       ['1', -308.18,  -9],
       ['3', -987.18,  34],
       ['3',-1153.71, -21],
       ['3',  -88.08,  75],
       ['3', -139.34, -85],
       ['6',   141.7,  90],
       ['6',   14.77,   4],
       ['6',    74.6,  -5]]

e = dict()
for i in ex:
    if i[0] in e.keys():
        e[i[0]][0] = e[i[0]][0]+i[1]
        e[i[0]][1] = e[i[0]][1]+i[2]
    else:
        e[i[0]] = [i[1], i[2]]
e1 = [[k,v[0],v[1]] for k,v in e.items()]
print(e1)
# output: 
# [['1', 1249.83, -1], ['3', -2368.31, 3], ['6', 231.07, 89]]
如果您的列表已经按第一个元素排序,

itertools.groupby 应该是合适的:

from itertools import groupby
from operator import itemgetter

result = []
for k, g in groupby(ex, itemgetter(0)):
    _, a, b = zip(*g)
    result.append([k, sum(a), sum(b)])

你可以写一个有点潦草浪费的单行:

[[k, sum(a), sum(b)] for k, (_, a, b) in ((k, zip(*g)) for k, g in groupby(ex, itemgetter(0)))]