例如,我有以下列表:
['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|']
希望通过 "|" 分割并拆分它,结果应该如下:
[[u'MOM', u'DAD'],[ u'GRAND'], [u'MOM', u'MAX', u'JULES']]
我该怎么做?我在网上只找到需要元素长度的子列表示例。
>>> [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']]
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']]
使用普通的for循环的简单解决方案(已被groupby解决方案击败,顺便说一句,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']]
>>> reduce(
lambda acc,x: acc+[[]] if x=='|' else acc[:-1]+[acc[-1]+[x]],
myList,
[[]]
)
[[], ['MOM', 'DAD'], ['GRAND'], ['MOM', 'MAX', 'JULES'], []]
itertools.groupby
,但你可能需要注意我的方法“正确地”将空列表放在了两端。=)[].split(token)
;输入只需省略末尾的 '|'
。 - ninjagecko
[list(x[1]) for x in itertools.groupby(myList, lambda x: x=='|') if not x[0]]
。 - ninjageckolist
和lambda
分开的原因。 - johnsyweb