Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python通过两个具有给定起始和结束位置的列表连接子字符串_Python_String_List_Substring_Concatenation - Fatal编程技术网

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

大家好,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])
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'