用分隔符分隔python列表中的联接项

用分隔符分隔python列表中的联接项,python,list,delimiter,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中如何实现这一点?使用生成器函数;该函数允许您控制何时“

我有一个如下的清单

list_1 = ['>name', 'aaa', 'bbb', '>name_1', 'ccc', '>name_2', 'ddd', 'eee', 'fff']
我试图在带有“>”符号的项目之间连接项目。因此,我想要的是:

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

在python中如何实现这一点?

使用生成器函数;该函数允许您控制何时“完成”项以生成:

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

子注释:在极不可能的情况下,您可以有重复的
>名称
s,如
['>name','>name','aaa'..]
只需将
和s
更改为
和object()
(这是唯一的)这可以处理所有可能的情况,我想我会使用
str.startswith
。@thefourtheye:对于1个字符的测试,我发现使用1个字符的切片更容易。我会更新它,因为它可能更清晰。@thefourtheye:切片更快(没有方法调用,所以不需要属性查找,等等)对于固定长度的测试也同样简单。
str.startswith()
在方法的输入是动态的或元组时开始发光。@MartijnPieters:slice的行为就像调用
\uuuuu getitem\uuuuuuuu
一样,这是一个属性查找和方法调用所必需的。另外,slice还包含一个比较运算符,它是一些额外的字节码和对
\uuuuu eq\uuuuu
的调用这里的属性查找和函数调用都是在C级别完成的,但我认为实际上是
unicode\u eq
unicode\u startswith
的内部结构在这里产生了最大的区别。(当然,这都是特定于CPython的…)无论如何,你在谈论(在我的机器上)78ns对101ns,那么…谁在乎呢?@abarnert是的,这是一个微优化。
>>> 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']