如何基于条件合并Python字符串列表中带##前缀的相邻元素
子词合并实现优化问题
问题描述
- 给定初始字符串列表:
stringlist = ['this', 'is', 'a', 'str', '##ing', 'list', 'for', 'ex', '##ample', 'for'] - 需求:将以
##开头的元素与其前一个元素合并,同时移除##前缀,最终期望输出结果为:['this', 'is', 'a', 'string', 'list', 'for', 'example', 'for'] - 现有实现代码:
new = [] for idx, ele in enumerate(stringlist): if ele.startswith('##'): new[-1] = new[-1] + ele[2:] else: new.append(ele)
方案解答
你现有的实现已经达到了最优时间复杂度,整体仅需遍历列表1次,时间复杂度为O(n),空间复杂度为O(n),没有多余的计算开销,运行效率足够应对绝大多数场景,包括超大输入量的处理。
如果追求更简洁的写法,可以用函数式编程的reduce实现,代码更紧凑:
from functools import reduce result = reduce( lambda res, cur: res[:-1] + [res[-1] + cur[2:]] if cur.startswith('##') else res + [cur], stringlist, [] )
注意:以上两种实现都默认第一个元素不会以
##开头,如果你的业务场景存在首元素就是##开头的情况,可以在逻辑最前面加边界判断处理即可,比如直接将其作为普通元素加入结果列表,或者抛出异常提示输入不合法。
内容的提问来源于stack exchange,提问作者SantoshGupta7
相关产品推荐
相关产品推荐

