2011-05-28 16 views

回答

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']] 
+0

这个解决方案对我来说是充满魔力的,但是非常完美!谢谢 – W0bble 2011-05-28 21:07:38

+2

阅读[groupby文档](http://docs.python.org/library/itertools.html#itertools.groupby)以获得开始。 :-) – 2011-05-28 21:10:30

+1

为了清楚起见,整行是:'itertools.groupby(myList,lambda x:x =='|')中的x [list(x [1])如果不是x [0]]' – ninjagecko 2011-05-28 22:04:01

4

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']] 
+2

该死!太慢了! – Johnsyweb 2011-05-28 21:14:24

1

使用普通的旧的for循环(简单的解决方案被打它的GROUPBY解决方案,这是BTW更好!)

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

当然,你想要用itertools.groupby,虽然你可能要指出,我的做法“正确”把空列表的末端。 =)

+0

当你说“正确”时,它是如何与来自问题或链接文章的期望输出相匹配的? – Johnsyweb 2011-05-28 22:04:15

+1

@Johnsyweb我很清楚。尽管如此,规范的语义却不雅观,应该等同于'[] .split(token)';输入应该忽略末尾的''|''。 – ninjagecko 2011-05-28 22:05:47