Reputation: 11
Need your help, to solve strugle with list of lists filtering, merging and summarizing. My input params:
Sample list (in_list):
in_list = [
['p0-1', 'p1-1', 'p2-1', 1, 1, 2],
['p0-1', 'p1-1', 'p2-1', 2, 1, 1],
['p0-1', 'p1-1', 'p2-1', 1, 2, 1],
['p0-2', 'p1-1', 'p2-1', 1, 1, 1],
['p0-2', 'p1-2', 'p2-1', 1, 1, 1],
['p0-2', 'p1-1', 'p2-2', 1, 1, 1]
]
My variant (I found it here) what i've got for now:
out_list = [[k, sum(q1 for p1, p2, p3, q1, q2, q3 in g)]
for k, g in groupby(sorted(in_list), key=itemgetter(0, 1, 2))]
My result (out_list):
print(out_list)
[
[('p0-1', 'p1-1', 'p2-1'), 4],
[('p0-2', 'p1-1', 'p2-1'), 1],
[('p0-2', 'p1-1', 'p2-2'), 1],
[('p0-2', 'p1-2', 'p2-1'), 1]
]
This comprehension almost do what I need, but summarizing only one q1 (or q2 or q3). And my tries about insert q2, q3 to this comprehension was unsuccessful. Is it possible to modify this comprehension to summarize q1, q2 and q3 at the same time? Or maybe exist more simple way to achieve what I need?
Desirable result list (out_list):
[
['p0-1', 'p1-1', 'p2-1', 4, 4, 4],
['p0-2', 'p1-1', 'p2-1', 1, 1, 1],
['p0-2', 'p1-2', 'p2-1', 1, 1, 1],
['p0-2', 'p1-1', 'p2-2', 1, 1, 1]
]
Thanks in advance and appreciate for any useful advises and help.
Upvotes: 1
Views: 67
Reputation: 195573
Try itertools.tee
:
in_list = [
["p0-1", "p1-1", "p2-1", 1, 1, 2],
["p0-1", "p1-1", "p2-1", 2, 1, 1],
["p0-1", "p1-1", "p2-1", 1, 2, 1],
["p0-2", "p1-1", "p2-1", 1, 1, 1],
["p0-2", "p1-2", "p2-1", 1, 1, 1],
["p0-2", "p1-1", "p2-2", 1, 1, 1],
]
from itertools import groupby, tee
from operator import itemgetter
out = []
for k, g in groupby(sorted(in_list), key=itemgetter(0, 1, 2)):
grps = tee(g, 3)
out.append([*k, *(sum(v[i] for v in g) for i, g in enumerate(grps, 3))])
print(out)
Prints:
[
["p0-1", "p1-1", "p2-1", 4, 4, 4],
["p0-2", "p1-1", "p2-1", 1, 1, 1],
["p0-2", "p1-1", "p2-2", 1, 1, 1],
["p0-2", "p1-2", "p2-1", 1, 1, 1],
]
Upvotes: 0