[英]python group on 2 keys in a list of lists and sum on 2 different values in each list
給定一個列表列表:
d = [['a', 'x', 10.5, 5 ],['a', 'x', 6.5, 4 ],['b', 'x', 4.0, 3 ],['b', 'x', 2.0, 2 ],['b', 'z', 5.5, 4 ]];
我努力了:
for key, rows in groupby(data, lambda x: (x[0], x[1])):
print (key, sum (r[2] for r in rows), sum (r[2] for r in rows) )
但是得到:
('a', 'x') 17.0 0
('b', 'x') 6.0 0
('b', 'z') 5.5 0
如何獲取列表的列表,該列表在第一個2個元素上分組,並在最后兩個float和int的每個元素上求和以得到:
[['a', 'x', 17.0, 9], ['b', 'x', 6.0 , 5],['b', 'z', 5.5 , 4]]
只需存儲groupby
返回的迭代器,以便可以對其進行多次迭代:
from itertools import groupby
d = [['a', 'x', 10.5, 5 ],['a', 'x', 6.5, 4 ],['b', 'x', 4.0, 3 ],
['b', 'x', 2.0, 2 ],['b', 'z', 5.5, 4 ]]
for key, rows in groupby(d, lambda x: (x[0], x[1])):
rows = tuple(rows)
print (key, sum (r[2] for r in rows), sum(r[3] for r in rows))
輸出:
(('a', 'x'), 17.0, 9)
(('b', 'x'), 6.0, 5)
(('b', 'z'), 5.5, 4)
groupby
產生(key, iterator)
元組,並且該迭代器只能迭代一次。 您的代碼嘗試執行兩次操作,因此第二次嘗試不執行任何操作,結果sum
為0
。
當然,您可以只使用列表推導,這將允許您跳過存儲部分:
[reduce(lambda x,y: k + map(sum, zip(x[2:],y[2:])), g)
for k, g in groupby(d, lambda x: x[:2])]
# [['a', 'x', 17.0, 9], ['b', 'x', 6.0, 5], ['b', 'z', 5.5, 4]]
列表理解的另一種選擇:
from itertools import groupby
[k + [sum(r) for i, r in enumerate(zip(*g)) if i >= 2] for k, g in groupby(d, key = lambda x: x[:2])]
# [['a', 'x', 17.0, 9], ['b', 'x', 6.0, 5], ['b', 'z', 5.5, 4]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.