加入由分隔符分隔的python列表中的项目

时间:2014-12-13 08:49:33

标签: python list delimiter

我有一个如下列表

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

我正在尝试使用'>"加入项目之间的项目。标志。所以我想要的是:

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

我怎么能在python中做到这一点?

2 个答案:

答案 0 :(得分: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']

答案 1 :(得分: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']

子注意:在极不可能的情况下,您可以将>name重复['>name', '>name', 'aaa'....],只需将and s更改为and object()(这是唯一的)并处理每一种可能的情况