从给定键的列表列表中添加值
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)))]
在下面的列表列表中,我希望提取按每个子列表的第一个元素分组的列表列表。在每个组中,我想将剩余元素的各自值相加。
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)))]