Manuel Santi
Manuel Santi

Reputation: 1132

Python create a list of lists groupped from unique values

In my code i have a list like this:

l1 = [['var1', '2'], ['var1', '5'], ['var1', 'a'], ['var2', '90']]

i try to generate a code that create starting from l1 a list like that:

[[['var1','2'],['var2','90']],[['var1','5'],['var2','90']],[['var1','a'], ['var2','90']]]

in practice three different list based on unique value but i have no idea how to perform this task, Is there a particular python func for achieve this result?

Thanks in advance

Upvotes: 1

Views: 54

Answers (2)

Adam Smith
Adam Smith

Reputation: 54243

looks like you need to start by grouping against your first elements

from itertools import groupby, product
from operator import itemgetter

grps = [list(grp) for _, grp in groupby(l1, key=itemgetter(0))]
# itemgetter(0) is the default, but this is somewhat more explicit.

then use itertools.product over those groups

result = product(*grps)

this will give you:

>>> l1 = [['var1', '2'], ['var1', '5'], ['var1', 'a'], ['var2', '90']]
result = [(['var1', '2'], ['var2', '90']), (['var1', '5'], ['var2', '90']), (['var1', 'a'], ['var2', '90'])]
>>> l2 = [['var1', '7'], ['var2', '2'], ['var2', '5']]
result = [(['var1', '7'], ['var2', '2']), (['var1', '7'], ['var2', '5'])]

Your final function then becomes:

from itertools import groupby, product
from operator import itemgetter

def product_by_grouping(lst):
    grps = [list(grp) for _, grp in groupby(lst, key=itemgetter(0))]
    return product(*grps)

Upvotes: 2

Ajax1234
Ajax1234

Reputation: 71471

You can use unpacking in Python3:

l1 = [['var1', '2'], ['var1', '5'], ['var1', 'a'], ['var2', '90']]
*l, _val = l1
l2 = [[i, _val] for i in l]

Output:

[[['var1', '2'], ['var2', '90']], [['var1', '5'], ['var2', '90']], [['var1', 'a'], ['var2', '90']]]

Upvotes: 2

Related Questions