【问题标题】:Join items in python list separated by delimiter [duplicate]加入由分隔符分隔的python列表中的项目[重复]
【发布时间】:2015-02-11 23:00:54
【问题描述】:

我有一个类似下面的列表

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

我试图用“>”符号加入项目之间的项目。所以我想要的是:

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

如何在 python 中做到这一点?

【问题讨论】:

    标签: python list delimiter


    【解决方案1】:

    使用生成器函数;这使您可以控制项目何时“完成”以产生:

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

    【讨论】:

    • 我想我会使用str.startswith
    • @thefourtheye:对于 1 个字符的测试,我发现使用 1 个字符的切片更容易。我会更新,因为它可能会更清楚。
    • @thefourtheye:切片速度更快(不需要方法调用,因此不需要属性查找等),并且对于固定长度的测试同样容易。当方法的输入是动态或元组时,str.startswith() 开始发光。
    • @MartijnPieters:切片的行为就像它调用__getitem__ 一样,它需要像属性查找和方法调用一样行事。另外,切片涉及一个比较运算符,它是一些额外的字节码和对__eq__ 的调用。此处的属性查找和函数调用都是在 C 级别完成的这一事实有所不同,但我认为实际上是 unicode_equnicode_startswith 的内部结构造成了最大的不同。 (当然,这都是 CPython 特有的……)无论如何,你是在谈论(在我的机器上)78ns 与 101ns,所以……谁在乎呢?
    • @abarnert 是的,这是一个微优化。
    【解决方案2】:
    >>> 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']
    

    附注:只是在极不可能的情况下,您可以拥有重复的 >names,例如 ['>name', '>name', 'aaa'....],只需将 and s 更改为 and object()(这是唯一的)并处理所有可能的情况支持>

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 2023-03-13
      • 2019-03-04
      • 1970-01-01
      • 2021-02-28
      • 2020-08-22
      相关资源
      最近更新 更多