Сделать Python Sublists из списка, используя разделитель - PullRequest
9 голосов
/ 29 мая 2011

У меня есть, например, следующий список:

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

и хотите, чтобы он был разделен "|" поэтому результат будет выглядеть так:

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

Как я могу это сделать? Я нахожу в сети только примеры подсписков, которым нужна длина элементов

Ответы [ 4 ]

15 голосов
/ 29 мая 2011
>>> [list(x[1]) for x in itertools.groupby(['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|'], lambda x: x=='|') if not x[0]]
[[u'MOM', u'DAD'], [u'GRAND'], [u'MOM', u'MAX', u'JULES']]
6 голосов
/ 29 мая 2011

itertools.groupby() делает это очень хорошо ...

>>> 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) if not is_key]
[[u'MOM', u'DAD'], [u'GRAND'], [u'MOM', u'MAX', u'JULES']]
1 голос
/ 29 мая 2011

Простое решение с использованием простого старого цикла for (было побито с ним для решения groupby, что кстати лучше!)

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 lists
while True:
    try:
        S.remove([])
    except ValueError:
        break

print S

Придает

[[u'MOM', u'DAD'], [u'GRAND'], [u'MOM', u'MAX', u'JULES']]
0 голосов
/ 29 мая 2011
>>> reduce(
        lambda acc,x: acc+[[]] if x=='|' else acc[:-1]+[acc[-1]+[x]], 
        myList,
        [[]]
    )
[[], ['MOM', 'DAD'], ['GRAND'], ['MOM', 'MAX', 'JULES'], []]

Конечно, вы хотели бы использовать itertools.groupby, хотя вы можете заметить, что мой подход «правильно» ставит пустые списки на концах. =)

...