How to split a list into subsets based on a pattern?
python
Solution
You could use `itertools.groupby`:
>>> import itertools
>>> mylist = ['sub_0_a', 'sub_0_b', 'sub_1_a', 'sub_1_b']
>>> for k,v in itertools.groupby(mylist,key=lambda x:x[:5]):
... print k, list(v)
...
sub_0 ['sub_0_a', 'sub_0_b']
sub_1 ['sub_1_a', 'sub_1_b']
or exactly as you specified it:
>>> [list(v) for k,v in itertools.groupby(mylist,key=lambda x:x[:5])]
[['sub_0_a', 'sub_0_b'], ['sub_1_a', 'sub_1_b']]
Of course, the common caveats apply (Make sure your list is sorted with the same key you're using to group), and you might need a slightly more complicated key function for real world data...
Problem
I'm doing this but it feels this can be achieved with much less code. It is Python after all. Starting with a list, I split that list into subsets based on a string prefix. ``` # Splitting a list into subsets # expected outcome: # [['sub_0_a', 'sub_0_b'], ['sub_1_a', 'sub_1_b']] mylist = ['sub_0_a', 'sub_0_b', 'sub_1_a', 'sub_1_b'] def func(l, newlist=[], index=0): newlist.append([i for i in l if i.startswith('sub_%s' % index)]) # create a new list without the items in newlist l = [i for i in l if i not in newlist[index]] if len(l): index += 1 func(l, newlist, index) func(mylist) ```