分开后,我有如下所示加入项目由分隔符
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', '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']
>>> 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 s
到and object()
(这是唯一的),并且处理每一个可能的情况下
我会用我想是'str.startswith'。 – thefourtheye 2014-12-13 08:53:09
@thefourtheye:对于1个字符的测试,我发现使用1个字符的切片更容易。我会更新,因为它可能会更清晰。 – 2014-12-13 08:53:55
@thefourtheye:切片速度更快(不需要方法调用,因此不需要属性查找等),而对于固定长度测试也同样简单。当方法的输入是动态或元组时,str.startswith()开始发光。 – 2014-12-13 08:56:00