11

たとえば、次のリストがあります。

['|', 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

4 に答える 4

15
>>> [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']]
于 2011-05-28T20:59:49.053 に答える
10

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']]
于 2011-05-28T21:14:05.993 に答える
1

単純な古い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']]
于 2011-05-28T21:20:01.270 に答える
0
>>> reduce(
        lambda acc,x: acc+[[]] if x=='|' else acc[:-1]+[acc[-1]+[x]], 
        myList,
        [[]]
    )
[[], ['MOM', 'DAD'], ['GRAND'], ['MOM', 'MAX', 'JULES'], []]

もちろん、あなたは使用したいと思うでしょうがitertools.groupby、私のアプローチは「正しく」最後に空のリストを置くことに注意したいかもしれません。=)

于 2011-05-28T21:59:44.480 に答える