Skip to content Skip to sidebar Skip to footer

Make Python Sublists From A List Using A Separator

I have for example the following list: ['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|'] and want it to be split by the '|' so the result would look like: [

Solution 1:

>>> [list(x[1]) for x in itertools.groupby(['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|'], lambda x: x=='|') ifnot x[0]]
[[u'MOM', u'DAD'], [u'GRAND'], [u'MOM', u'MAX', u'JULES']]

Solution 2:

itertools.groupby() does this very nicely...

>>> import itertools
>>> l = ['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|']
>>> key = lambda sep: sep == '|'>>> [list(group) for is_key, group in itertools.groupby(l, key) ifnot is_key]
[[u'MOM', u'DAD'], [u'GRAND'], [u'MOM', u'MAX', u'JULES']]

Solution 3:

Simple solution using plain old for-loop (was beaten to it for the groupby solution, which BTW is better!)

seq = ['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|']

S=[]
tmp=[]

for i in seq:
    if i == '|':
        S.append(tmp)
        tmp = []
    else:
        tmp.append(i)

# Remove empty listswhileTrue:
    try:
        S.remove([])
    except ValueError:
        breakprint S

Gives

[[u'MOM', u'DAD'], [u'GRAND'], [u'MOM', u'MAX', u'JULES']]

Solution 4:

>>> reduce(
        lambda acc,x: acc+[[]]if x=='|'else acc[:-1]+[acc[-1]+[x]], 
        myList,
        [[]]
    )
[[], ['MOM', 'DAD'], ['GRAND'], ['MOM', 'MAX', 'JULES'], []]

Of course you'd want to use itertools.groupby, though you may wish to note that my approach "correctly" puts empty lists on the ends. =)

Post a Comment for "Make Python Sublists From A List Using A Separator"