2014-12-13 87 views
4

分开后,我有如下所示加入项目由分隔符

list_1 = ['>name', 'aaa', 'bbb', '>name_1', 'ccc', '>name_2', 'ddd', 'eee', 'fff'] 

我试图加入的项目之间的项目与“>”符号列表,所以,我想的是:

list_1 = ['>name', 'aaabbb', '>name_1', 'ccc', '>name_2', 'dddeeefff'] 

我如何能做到这一点在Python

回答

5

使用发电机的功能,也就是说可以让你控制时“完成”的项目产生:

def join_unescaped(it): 
    tojoin = [] 
    for element in it: 
     if element.startswith('>'): 
      if tojoin: 
       yield ''.join(tojoin) 
       tojoin = [] 
      yield element 
     else: 
      tojoin.append(element) 
    if tojoin: 
     yield ''.join(tojoin) 

产生一个新的列表,然后从你的输入,通过所产生的list()函数发生器对象:

result = list(join_unescaped(list_1)) 

演示:

>>> list_1 = ['>name', 'aaa', 'bbb', '>name_1', 'ccc', '>name_2', 'ddd', 'eee', 'fff'] 
>>> def join_unescaped(it): 
...  tojoin = [] 
...  for element in it: 
...   if element.startswith('>'): 
...    if tojoin: 
...     yield ''.join(tojoin) 
...     tojoin = [] 
...    yield element 
...   else: 
...    tojoin.append(element) 
...  if tojoin: 
...   yield ''.join(tojoin) 
... 
>>> list(join_unescaped(list_1)) 
['>name', 'aaabbb', '>name_1', 'ccc', '>name_2', 'dddeeefff'] 
+0

我会用我想是'str.startswith'。 – thefourtheye 2014-12-13 08:53:09

+0

@thefourtheye:对于1个字符的测试,我发现使用1个字符的切片更容易。我会更新,因为它可能会更清晰。 – 2014-12-13 08:53:55

+0

@thefourtheye:切片速度更快(不需要方法调用,因此不需要属性查找等),而对于固定长度测试也同样简单。当方法的输入是动态或元组时,str.startswith()开始发光。 – 2014-12-13 08:56:00

5
>>> from itertools import groupby 
>>> list_1 = ['>name', 'aaa', 'bbb', '>name_1', 'ccc', '>name_2', 'ddd', 'eee', 'fff'] 
>>> [''.join(v) for k, v in groupby(list_1, key=lambda s: s.startswith('>'))] 
['>name', 'aaabbb', '>name_1', 'ccc', '>name_2', 'dddeeefff'] 

的唯一情况来监视这里是如果您没有>标志之间的项目,这需要一个简单的修复。

>>> list_1 = ['>name', '>name0', 'aaa', 'bbb', '>name_1', 'ccc', '>name_2', 'ddd', 'eee', 'fff'] 
>>> [''.join(v) for k,v in groupby(list_1,key=lambda s:s.startswith('>')and s)] 
['>name', '>name0', 'aaabbb', '>name_1', 'ccc', '>name_2', 'dddeeefff'] 

Sub注意:只是,你可以有重复>name就像['>name', '>name', 'aaa'....]极不可能的情况下,只是改变and sand object()(这是唯一的),并且处理每一个可能的情况下