python通过两个具有给定开始和结束位置的列表连接子字符串

时间:2013-10-30 02:48:39

标签: 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])

AAAACCCCEEEEGGGG

如果开始和结束位置增加,我必须使用for循环 迭代两个列表中每个元素的开始和结束位置。

你能帮助我解决这个问题吗?

提前谢谢。

5 个答案:

答案 0 :(得分:3)

您可以使用zip

''.join(string[a:b] for a, b in zip(start_list, end_list))

zip结合了多个迭代器:

print zip(start_list, end_list)
> [(0, 4), (8, 12), (16, 20), (24, 28)]

如果索引列表很长,您可能希望使用izip。请参阅:When is it better to use zip instead of izip?

答案 1 :(得分:2)

您可以使用reducezip执行此操作:

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

这会迭代每个(start, stop)索引对,并将这些索引给出的string子字符串连接在一起。

同样,您可以使用列表推导或生成器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

答案 2 :(得分:2)

>>> ''.join(map(string.__getslice__, start_list, end_list))
'AAAACCCCEEEEGGGG'

答案 3 :(得分:0)

使用List Comprehensionsstr.join,您可以轻松实现此目标:

''.join([string[v:end_list[i]] for i, v in enumerate(start_list)])

或者,您可以使用内置的zip()功能:

''.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()

>>> a = ''.join([string[start:end] for start, end in zip(start_list, end_list)])
>>> print(a)
AAAACCCCEEEEGGGG

希望这有帮助!

答案 4 :(得分:0)

除了已提供的答案外,您还可以:

''.join(map(lambda a,b: string[a:b], start_list, end_list))