Dmitry R.
Dmitry R.

Reputation: 11

Merging and sum up items in looping trough nested lists

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

Answers (1)

Andrej Kesely
Andrej Kesely

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

Related Questions