Reputation: 1132
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
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
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