python通过两个具有给定起始和结束位置的列表连接子字符串
大家好,Python大师们 正如标题所说,我必须将子字符串与两个列表中分别提供的开始位置和结束位置信息连接起来 比如说,python通过两个具有给定起始和结束位置的列表连接子字符串,python,string,list,substring,concatenation,Python,String,List,Substring,Concatenation,大家好,Python大师们 正如标题所说,我必须将子字符串与两个列表中分别提供的开始位置和结束位置信息连接起来 比如说, string = 'AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJKKKK' start_list = [0,8,16,24] end_list = [4,12,20,28] 最终结果应该是这样的 print (string[0:4]+string[8:12]+string[16:20]+string[24:28]) aaaac
string = 'AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJKKKK'
start_list = [0,8,16,24]
end_list = [4,12,20,28]
最终结果应该是这样的
print (string[0:4]+string[8:12]+string[16:20]+string[24:28])
aaaacccceeegg
如果开始和结束位置增加,我必须使用for循环
迭代两个列表中每个元素的开始和结束位置
你能帮我处理一下吗
提前感谢。您可以使用:
zip
组合了多个迭代器:
print zip(start_list, end_list)
> [(0, 4), (8, 12), (16, 20), (24, 28)]
如果索引列表很长,可能需要使用
izip
。请参阅:您可以使用reduce
和zip
来执行此操作:
In [1]: timeit reduce(lambda s, (i, j): s + string[i:j], zip(start_list, end_list), '')
100000 loops, best of 3: 2.67 μs per loop
这将迭代每个(开始、停止)
索引对,并将这些索引给出的字符串的子字符串连接在一起
类似地,您可以使用列表理解或生成器和join
:
In [3]: # generator
In [4]: timeit ''.join( string[i:j] for i, j in zip(start_list, end_list) )
100000 loops, best of 3: 3.43 μs per loop
In [5]: # list comprehension
In [6]: timeit ''.join([ string[i:j] for i, j in zip(start_list, end_list) ])
100000 loops, best of 3: 1.86 μs per loop
最后,您可以使用@gnibbler使用字符串切片的答案:
In [7]: #slicing
In [8]: timeit ''.join(map(string.__getslice__, start_list, end_list))
100000 loops, best of 3: 1.82 μs per loop
使用timeit
,最快的方法似乎是使用列表切片和join
,然后是join
和列表理解,然后使用reduce
,您可以轻松实现这一点:
''.join([string[v:end_list[i]] for i, v in enumerate(start_list)])
或者,您可以只使用内置功能:
''.join([string[start:end] for start, end in zip(start_list, end_list)])
演示-列表理解:
>>> a =''.join([string[v:end_list[i]] for i, v in enumerate(start_list)])
>>> print(a)
AAAACCCCEEEEGGGG
使用zip()
:
希望这有帮助 除了已经提供的答案外,您还可以:
''.join(map(lambda a,b: string[a:b], start_list, end_list))
你能试试我的答案吗?@gnibler谢谢你的提示!我已经更新了帖子。
>>> a = ''.join([string[start:end] for start, end in zip(start_list, end_list)])
>>> print(a)
AAAACCCCEEEEGGGG
''.join(map(lambda a,b: string[a:b], start_list, end_list))
>>> ''.join(map(string.__getslice__, start_list, end_list))
'AAAACCCCEEEEGGGG'